如果人们想看看,请在这里编辑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);
    }


编辑#2
调用堆栈


  GHI.EventRepository.dll!GHI.EventRepository.AggregateRoot.OnEvent(GHI.EventRepository.IEvent事件,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消息)第40行+ 0x95字节C#
      GHI.Bus.ZeroMQ.dll!GHI.Bus.ZeroMQ.MessageSubscriber.ProcessMessage(GHI.Bus.Message消息)第48行+ 0x38字节C#
      GHI.Bus.ZeroMQ.dll!GHI.Bus.ZeroMQ.MessageSubscriber.RecieveMessages(object o)第39行+ 0x13字节C#
      mscorlib.dll!System.Threading.ExecutionContext.runTryCode(对象userData)+ 0x173字节
      [从本地过渡到托管过渡]
      [管理到本地过渡]
      mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContextexecutionContext,System.Threading.ContextCallback回调,对象状态,bool keepSyncCtx)+ 0xeb字节
      mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executeContext,System.Threading.ContextCallback回调,对象状态)+ 0x3b字节
      mscorlib.dll!System.Threading.ThreadHelper.ThreadStart(对象obj)+ 0x5d字节
      [从本地过渡到托管过渡]
      [Appdomain转换]
      [从本地过渡到托管过渡]


如果方便的话,我可以将它弹出到Github上

编辑#4
感谢大家的帮助,很高兴我可以从那段代码中删除dynamic关键字。
动态不是问题,这是我锁定的方式,再次感谢您,我赞成上述提到动态问题的内容,并将接受下面的答案

最佳答案

我对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);
}


如果行为没有变化,则问题可能出在其他地方。

(除非您完全确定它会一直存在,否则可能要在调用周围添加一个if(method != null)。)

关于c# - C#动态关键字和线程安全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10081508/

10-11 04:00