2

人々が見たい場合は、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 event) 行 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# [Managed Transition にネイティブ]
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(オブジェクト o) 行 39 + 0x13 バイト C# mscorlib.dll!System.Threading.ExecutionContext.runTryCode(オブジェクト userData) + 0x173 バイト
[ネイティブからマネージドへの移行]
[マネージドからネイティブへの移行]
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback コールバック, オブジェクトの状態, bool preserveSyncCtx) + 0xeb バイト
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext、System.Threading.ContextCallback コールバック、オブジェクト状態) + 0x3b バイト
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart(オブジェクト obj) + 0x5d バイト[管理された移行にネイティブ]
[アプリドメインの移行]
[管理された移行にネイティブ]

簡単であれば、これを Github にポップできます

編集 #4 みんなの助けに感謝します。そのコードから dynamic キーワードを削除できてよかったです。動的は問題ではありませんでした。スタックをロックする方法でした。ありがとうございます。動的な問題について言及したものに賛成票を投じました。以下の回答を受け入れます。

4

1 に答える 1

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

動作に変化がない場合、問題は別の場所にある可能性があります。

if(method != null)(常にそこにあることが絶対に確実でない限り、おそらく Invoke の周りに a を追加したいと思うでしょう。)

于 2012-04-10T01:25:06.613 に答える