如何调试"Cannot close an uninitialised Msg" FaultException?

How to debug "Cannot close an uninitialised Msg" FaultException?

我的应用程序因 "Cannot close an uninitialised Msg" 未处理 异常而崩溃。这可能是由于从多个线程访问套接字。

我在调试这个问题时遇到了问题,因为当我查看我的代码时,所有对套接字的访问都是在轮询线程中完成的——或者直接在 ReceiveReady 事件处理程序中(轮询线程上的 运行根据我的理解定义)或手动创建 Tasknew Task(...)),然后在轮询器线程上启动(task.Start(poller))。 所以我看不到它可能发生的地方。

第二个问题是它是未处理的异常 -- 我将所有 sending/receiving 包装在 try-catch 中,但异常发生在外面的某个地方。

我正在寻找如何有效地调试它并查明我的代码中出现问题的地方。


代码示例——正如我所写,我只使用了两个 "patterns":

直接使用轮询器线程(感谢在轮询器线程上触发的事件):

 private async void OnMessageReceiveReady(object sender, NetMQSocketEventArgs args)
 {
     NetMQSocket socket = args.Socket;

     NetMQMessage mq_msg = socket.ReceiveMultipartMessage();
     ...

从任意线程切换到 poller 的线程:

Task sending = new Task(() =>
{
    foreach (NetMQFrame address in mq_envelope)
        socket.SendMoreFrame(address.ConvertToString());

    socket.SendFrame(response_data);
});
sending.Start(this.sharedPoller);
await sending.ConfigureAwait(false);

不幸的是,除了反复试验和更多日志记录,我没有找到任何其他方法。

问题出在处理套接字上——我有 运行ning 轮询器(共享),我尝试 RemoveDispose 套接字,但我发现这两个方法是异步的。

作为解决方案,我将 RemoveDispose 分组在单独的任务中,然后将其安排到轮询器中的 运行。手头有 task 我可以在其上调用 Wait 这样我就可以在我的 Dispose.

中实现阻塞、同步行为