Почему я иногда получаю исключение нулевой ссылки после?. проверять?

У меня есть приложение, работающее круглосуточно на моем рабочем столе дома, которое использует библиотеку websocket для подключения к своим службам (эта часть написана не мной, но у меня есть код), и очень редко оно выдает NullReferenceException в этой строке:

socket?.Dispose();

Он настроен таким образом, что он повторно подключается каждые 3-5 минут из-за ненадежности службы. Допустим, в день эта строка может выполняться ~ 300 раз. Это происходило, вероятно, каждые 3-4 месяца в течение последних 3 лет. Приложение регулярно обновляется до последней версии C# framework, начиная с 4.5.

При каких обстоятельствах может возникнуть это исключение?

Возможно состояние гонки

TheGeneral 11.04.2018 11:47

Каково содержание метода Dispose?

DavidG 11.04.2018 11:48

Является ли метод сокета или Dispose индивидуальной реализацией?

ngeksyo 11.04.2018 11:48

Это абстрактно, поэтому должен быть метод переопределения

Peter B 11.04.2018 11:54

Я предполагаю, что socket выдает не исключение nullreferenceexception, а реализацию .Dispose(). @ngeksyo выглядит так, как будто веб-сокет является абстрактным, поэтому он действительно должен быть индивидуальной реализацией.

Cleptus 11.04.2018 11:56

Нет, это обычная немодифицированная реализация. Я не уверен в состоянии гонки, но думаю, что это может иметь какое-то отношение к тому, как долго она работает. Возможно, он неправильно закрывает сокеты, и через некоторое время он выходит за допустимый предел, и это каким-то образом приводит к исключению, которое я получаю.

user1306322 11.04.2018 11:56

Какого типа переменная socket? источник, который вы связали, является абстрактным классом. есть кастомная реализация на основе WebSocket? ClientWebSocket? WebSocketbase?

Cleptus 11.04.2018 12:03

Довольно сомнительный код. Если вы не можете узнать, действительна ли ссылка на сокет, как вы могли узнать, что удаление безопасно? Наверняка это был лейкопластырь от существующей гоночной ошибки. Ага, не работает.

Hans Passant 11.04.2018 12:10

Итак, что такое трассировка стека этого исключения?

Evk 11.04.2018 13:02

Вы можете показать нам, как создается socket?

Bradley Uffner 11.04.2018 13:46
3
11
97
1

Ответы 1

В документация указано, что для obj?.DoSomething() акцент мой:

The new way [using ?.] is thread-safe because the compiler generates code to evaluate [obj] one time only, keeping the result in a temporary variable.

Таким образом, проблема может быть вызвана только выполнением Dispose(), будь то часть фреймворка или ваша собственная реализация.

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