Как отладить FaultException "Не удается закрыть неинициализированную Msg"?
У меня происходит сбой приложения из-за необработанного исключения "Не удается закрыть неинициализированную Msg". Вероятно, это связано с доступом к сокету из нескольких потоков.
И у меня есть проблема отладки этой проблемы, потому что, когда я рассматриваю свой код, весь доступ к сокету делается в потоке poller - либо в ReceiveReady
обработчик событий напрямую (который запускается в потоке-опросчике по определению, как я понимаю) или в ручном режиме Task
(new Task(...)
), а затем начал на потоке Poller (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 ответ
К сожалению, я не нашел другого метода, кроме проб и ошибок и большего количества журналов.
И проблема была с утилизацией сокетов - у меня запущен poller (общий доступ), и я попытался Remove
а также Dispose
Сокет, однако я обнаружил, что эти два метода являются асинхронными.
В качестве решения я группирую Remove
а также Dispose
вместе в отдельном задании, а затем запланировать его запуск в poller. имеющий task
в руке я могу позвонить Wait
на этом и таким образом я добиваюсь блокирования, синхронного поведения в моем Dispose
,