C# 无法解释的零星Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
我们已经看到了零星的坠机事件(到目前为止已有2次),我无法解释 给定以下代码(简化为核心):C# 无法解释的零星Microsoft.CSharp.RuntimeBinder.RuntimeBinderException,c#,.net,generics,C#,.net,Generics,我们已经看到了零星的坠机事件(到目前为止已有2次),我无法解释 给定以下代码(简化为核心): 我试图在MicrosoftConnect上提交此消息,但他们关闭了该站点:您如何知道崩溃发生在这条线上?是否使用堆栈跟踪中的行号信息?也许您可以显示完整的堆栈跟踪?我想说的是,您不应该太信任堆栈跟踪中的行号,但我看到PublishMessageReceivedOnMessageBus是堆栈跟踪中的最后一个,所以我真的不知道您提供的代码如何实现这一点。除了我在堆栈跟踪中看到MessageDeseriali
我试图在MicrosoftConnect上提交此消息,但他们关闭了该站点:您如何知道崩溃发生在这条线上?是否使用堆栈跟踪中的行号信息?也许您可以显示完整的堆栈跟踪?我想说的是,您不应该太信任堆栈跟踪中的行号,但我看到
PublishMessageReceivedOnMessageBus
是堆栈跟踪中的最后一个,所以我真的不知道您提供的代码如何实现这一点。除了我在堆栈跟踪中看到MessageDeserializer是泛型类,而在您的示例中不是。PublishMessageReceivedOnMessageBus是否以某种方式使用了MessageDeserializer
的泛型参数?将示例代码更改为使用泛型类来承载发布函数。还添加了一些并发任务来调用它。就像一个符咒-没有崩溃-不知道为什么失败。并发不应该有任何影响。也许将该部分更改为使用常规反射而不是动态反射可以提供一些信息(动态使用反射,所以应该不是问题)。到目前为止-我已经没有想法了:)(顺便说一下-作为动态的
没有效果,可以在抛出的那行中删除)。
namespace ConsoleApp1
{
using System;
using System.Threading.Tasks;
public interface IMessage { }
public class Message : IMessage { }
public class Response : Message { }
public class MessageA : Response { }
public class MessageB : Response { }
public class MessageC : Response { }
public class MessageReceived<TMessage> where TMessage : IMessage
{
public TMessage Message { get; internal set; }
public DateTimeOffset ReceiveTimestamp { get; internal set; }
}
public sealed class MessageDeserializer<TMessageType> where TMessageType : Message
{
public void PublishMessageReceivedOnMessageBus(Message message, DateTimeOffset receiveTimestamp)
{
var messageReceivedType = typeof(MessageReceived<>).MakeGenericType(message.GetType());
dynamic messageReceived = Activator.CreateInstance(messageReceivedType);
messageReceived.Message = message as dynamic;
messageReceived.ReceiveTimestamp = receiveTimestamp;
Console.WriteLine($"Message publish : {messageReceived}, Thread: {Environment.CurrentManagedThreadId}");
}
}
class Program
{
static void Main(string[] args)
{
var p = new MessageDeserializer<Response>();
Task.Run(() => { for (;;) p.PublishMessageReceivedOnMessageBus(new MessageA(), DateTimeOffset.Now);});
Task.Run(() => { for (; ; ) p.PublishMessageReceivedOnMessageBus(new MessageB(), DateTimeOffset.Now); });
Task.Run(() => { for (; ; ) p.PublishMessageReceivedOnMessageBus(new MessageC(), DateTimeOffset.Now); });
Task.Run(() => { for (; ; ) p.PublishMessageReceivedOnMessageBus(new Response(), DateTimeOffset.Now); });
Task.Run(() => { for (; ; ) p.PublishMessageReceivedOnMessageBus(new Message(), DateTimeOffset.Now); });
Console.ReadLine();
}
}
}
Type: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
Message: Cannot implicitly convert type '[...].MessageRsp' to '[...].MessageErr'
StackTrace:
at CallSite.Target(Closure , CallSite , Object , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
at [...].MessageDeserializer`1.PublishMessageReceivedOnMessageBus(Message message, DateTimeOffset receiveTimestamp) in in [...]MessageDeserializer.cs:line 315
at [...].MessageDeserializer`1.DeserializeMessageBytes(Byte[] messageBytes, Boolean logResponseData) in [...] MessageDeserializer.cs:line 299
at System.Reactive.AnonymousSafeObserver`1.OnNext(T value) at ReactiveExtensions.Contrib.SingleThreadSynchronizationContext.Run() in [...]
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()