如果人们想看一眼,编辑会继续阅读github页面 https://github.com/brandongrossutti/EventStore
我有一个非常奇怪的问题,并且无法确定根本原因。 我在自己的线程上有一个zeromq订阅者。 当它收到一条消息时,它会调用一个委托,然后进入一个消息处理程序,最终进入这个动态调用
private void OnEvent(IEvent @event, bool isNew)
{
string eventName = "On" + @event.GetType().Name.Replace("Event", "");
dynamic inheritingClass = this;
MethodInfo method = inheritingClass.GetType().GetMethod(eventName);
method.Invoke(inheritingClass, new object[] { @event });
if (isNew)_uncommitedEvents.Add(@event);
}
它在调用时死亡,调用堆栈和异常不显示任何东西。 如果我慢慢走过,似乎工作得很好。很困惑。
提前致谢
编辑:
下面是启动订阅者的线程编写错误的代码
private readonly IHandlerResolver _resolver;
private readonly Thread _subscriberThread;
public MessageSubscriber(OnTheWireBusConfiguration configuration, IHandlerResolver resolver)
{
_resolver = resolver;
_subscriberThread = new Thread(RecieveMessages);
_subscriberThread.Start(new object[] { configuration, resolver, new Action<Message>(ProcessMessage) });
}
private static void RecieveMessages(object o)
{
object[] obj = o as object[];
OnTheWireBusConfiguration configuration = (OnTheWireBusConfiguration)obj[0];
IHandlerResolver resolver = (IHandlerResolver)obj[1];
Action<Message> handlerDelegate = (Action<Message>) obj[2];
using (var context = new Context(configuration.MaxThreads))
{
using (Socket subscriber = context.Socket(SocketType.SUB))
{
subscriber.Subscribe("", Encoding.Unicode);
subscriber.Connect("tcp://localhost:5565");
while (true)
{
byte[] buffer = subscriber.Recv();
Message message = (Message) configuration.Deserialize(buffer);
Console.WriteLine(message);
handlerDelegate(message);
//resolver.ExecuteHandler(message);
}
}
}
}
public void ProcessMessage(Message message)
{
_resolver.ExecuteHandler(message);
}
EDIT#2 调用堆栈
GHI.EventRepository.dll!GHI.EventRepository.AggregateRoot.OnEvent(GHI.EventRepository.IEvent event,bool isNew)第39行C# GHI.EventRepository.dll!GHI.EventRepository.AggregateRoot.OnEvent(GHI.EventRepository.IEvent事件)第29行+ 0x12字节C# GHI.TestDomain.dll!GHI.TestDomain.Model.TestAggregateRoot.TestAggregateRoot(System.Guid id)第15行+ 0x59字节C# GHI.TestDomain.dll!GHI.TestDomain.Handlers.CreateNewTestAggregateRootCommandHandler.HandleMessage(GHI.TestDomain.Messages.CreateNewTestAggregateRootCommand消息)线20个+ 0X62字节C# [原产于管理过渡]
GHI.Bus.dll!GHI.Bus.HandlerResolver.ExecuteHandler(GHI.Bus.Message message)第40行+ 0x95字节C# GHI.Bus.ZeroMQ.dll!GHI.Bus.ZeroMQ.MessageSubscriber.ProcessMessage(GHI.Bus.Message message)第48行+ 0x38字节C# GHI.Bus.ZeroMQ.dll!GHI.Bus.ZeroMQ.MessageSubscriber.RecieveMessages(对象o)第39行+ 0x13字节C# mscorlib.dll!System.Threading.ExecutionContext.runTryCode(object userData)+ 0x173 bytes
[原产于管理过渡]
[管理到原生过渡]
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state,bool preserveSyncCtx)+ 0xeb bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback回调,对象状态)+ 0x3b字节
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart(object obj)+ 0x5d bytes [原产于管理过渡]
[Appdomain Transition]
[原生于管理过渡]
如果更容易
我可以将它弹到Github上 编辑#4。编辑#4 感谢大家的帮助,很高兴我可以从那段代码中删除动态关键字。 动态不是问题,这是我的锁定方式,再次感谢你,我已经提出动态问题,并接受以下答案答案 0 :(得分:2)
我不熟悉zeromq,但是看看你的OnEvent
方法,我根本没有看到dynamic
。不使用dynamic
时会发生什么情况,并用此替换方法?
private void OnEvent(IEvent @event, bool isNew)
{
string eventName = "On" + @event.GetType().Name.Replace("Event", "");
MethodInfo method = this.GetType().GetMethod(eventName);
method.Invoke(this, new object[] { @event });
if (isNew)_uncommitedEvents.Add(@event);
}
如果行为没有变化,则问题可能出在其他地方。
(可能想在Invoke周围添加if(method != null)
,除非你绝对确定它会一直存在。)