由于“无法关闭未初始化的消息”未处理的异常,我的应用程序崩溃。这可能是由于从多个线程访问套接字。
我在调试这个问题时遇到了问题,因为当我查看我的代码时,所有对套接字的访问都是在轮询线程中完成的——ReceiveReady
直接在事件处理程序中(根据我的理解,它在轮询线程上运行)或手动创建的Task
(new 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);