C# Оператор Race-Condition и Null-Condition в вызовах методов цепочки объектов / методов - PullRequest
0 голосов
/ 17 февраля 2020

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

Симптомы:

При наличии вложенных объектов, например, Class A, имеющий ссылку на Class B, имеющий ссылку на Class C, имеющий функцию, подобную MyCall(), и я должен вызвать эту функцию, но я Я не могу быть уверен, что какой-либо из классов был удален или обнулен, я обычно использую Нулевой условный оператор в качестве упрощенного вызова:

myClassC?.myClassB?.myClassC?.MyCall();

Это обычно работает просто отлично, но в очень в редких случаях выполнение останавливается с NullReferenceException.

Это происходит, когда, например, где-то в коде вызывается ClientSession?.WebsocketConnection?.SocketConnection?.Disconnect(), чтобы отключить сокет клиента, но пока этот вызов выполняется асинхронно, клиент удаленно отключается, и например, SocketConnection класс удаляется.

Таким образом, условие гонки вызывает ситуацию, когда нулевая проверка фактически может дойти до вызова функции в конце, но когда выполнение происходит любым объект в цепочке становится нулевым, поэтому метод не может быть выполнен, поэтому вызывает NullReferenceException.

Вопрос:

Что должно быть правильным способом, чтобы избежать эта ситуация? Без использования try/catch, потому что это приложение, чувствительное к производительности, и с точки зрения моих тестов, обнаружение ошибки вроде этого довольно дорого.

Есть ли какой-нибудь правильный способ отменить выполнение, если какой-либо объект обнуляется?

Спасибо за помощь.

...