如何调试“无法关闭未初始化的Msg”FaultException?

时间:2017-07-26 10:20:06

标签: c# multithreading sockets debugging netmq

由于“无法关闭未初始化的消息”未处理的异常,我的应用程序崩溃了。这可能是由于从多个线程访问套接字。

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

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

我正在寻找如何有效地调试它并找出我的代码中行为不当的地方的方法。

代码示例 - 正如我所写,我只使用了两个“模式”:

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

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

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

从任意线程切换到轮询器的线程:

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

1 个答案:

答案 0 :(得分:0)

不幸的是,除了试用和错误以及更多日志记录之外,我没有找到任何其他方法。

问题在于处理套接字 - 我运行了poller(共享),我尝试了RemoveDispose套接字,但我发现这两种方法都是异步的。

作为解决方案,我将RemoveDispose分组在一起,然后将其安排在poller中运行。掌握task后,我可以在其上调用Wait,这样我就可以在Dispose中实现阻止,同步行为。