0

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

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

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

我正在寻找如何有效调试它并查明代码中行为不端的位置的方法。


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

直接使用 poller 线程(感谢 poller 线程上触发的事件):

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

1 回答 1

0

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

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

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

于 2017-07-27T10:25:13.533 回答