Как отладить 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,

Другие вопросы по тегам