Как обрабатывать ошибку сокета во время рутины выхода

StackOverflow https://stackoverflow.com/questions/2832130

  •  26-09-2019
  •  | 
  •  

Вопрос

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

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

Пример - Конечные пользовательские вызовы функции вызовы вызовов, и хотя функция выхода в систему ожидает существующих запросов, в которых необходимо закончить, сокет бросает исключение в потоке для чтения.

У меня есть два варианта, когда я вижу это -

  1. Притворись, что ошибка не произошла, и просто действовать как разъем, отключенный как часть нашей выхода.

  2. Когда появляется исключение сокета, см. В разделе «Запрос выхода из системы», и, если это так, переопределите его. В результате первоначального запроса выхода выхода бросает alreadyloggedOutexception, а также отдельное событие выхода из системы, которое проходит исключение в logouteventargs.

Также, слегка связано - что я должен делать, если сервер инициирует выключение, которое не было запрошено (то есть .. Чтение вызова возвращается NULL) ..NET Messenger Server имеет тенденцию сделать это, если вы отправите запрос не нравится Я относится к этому как исключение в себе?

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

Я пытался заняться этой вещью в моей голове так долго, это сводит меня с ума.

Это было полезно?

Решение

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

Я решил, что если отключение происходит во время выхода, то это не является исключением, так как выходит в систему в любом случае. Я просто игнорирую исключение в этом случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top