Мое приложение аварийно завершает работу из-за необработанного исключения "Не удается закрыть неинициализированное сообщение". Вероятно, это связано с доступом к сокету из нескольких потоков.
И у меня есть проблема с отладкой этой проблемы, потому что, когда я просматриваю свой код, весь доступ к сокету осуществляется в потоке опроса - либо напрямую в обработчике событий ReceiveReady
(который запускается в потоке опроса по определению, насколько я понимаю), либо в созданном вручную Task
( new 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);
lock
? Нет, события запускаются в потоке опроса, поэтому в данный момент времени может быть запущен только один, верно? Спасибо за совет, но он больше касается производительности, а не многопоточного выполнения. Возможно ли получить такое исключение, потому что кодReceiveReady
занимает немного больше времени? - person astrowalker   schedule 26.07.2017