如何调试"Cannot close an uninitialised Msg" FaultException?
How to debug "Cannot close an uninitialised Msg" FaultException?
我的应用程序因 "Cannot close an uninitialised Msg" 未处理 异常而崩溃。这可能是由于从多个线程访问套接字。
我在调试这个问题时遇到了问题,因为当我查看我的代码时,所有对套接字的访问都是在轮询线程中完成的——或者直接在 ReceiveReady
事件处理程序中(轮询线程上的 运行根据我的理解定义)或手动创建 Task
(new 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 轮询器(共享),我尝试 Remove
和 Dispose
套接字,但我发现这两个方法是异步的。
作为解决方案,我将 Remove
和 Dispose
分组在单独的任务中,然后将其安排到轮询器中的 运行。手头有 task
我可以在其上调用 Wait
这样我就可以在我的 Dispose
.
中实现阻塞、同步行为
我的应用程序因 "Cannot close an uninitialised Msg" 未处理 异常而崩溃。这可能是由于从多个线程访问套接字。
我在调试这个问题时遇到了问题,因为当我查看我的代码时,所有对套接字的访问都是在轮询线程中完成的——或者直接在 ReceiveReady
事件处理程序中(轮询线程上的 运行根据我的理解定义)或手动创建 Task
(new 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 轮询器(共享),我尝试 Remove
和 Dispose
套接字,但我发现这两个方法是异步的。
作为解决方案,我将 Remove
和 Dispose
分组在单独的任务中,然后将其安排到轮询器中的 运行。手头有 task
我可以在其上调用 Wait
这样我就可以在我的 Dispose
.