Как обрабатывать ошибку сокета во время рутины выхода
Вопрос
Я пишу библиотеку обмена мгновенными сообщениями. В настоящее время, когда SocketException поднимается во время чтения или записи в сокет, я запускаю рутину выхода из системы изнутри приложения, передавая SocketException к эншедеру в качестве аргумента Logouteventargs. Это дает конечному пользователю способ увидеть, какое основное исключение фактически вызвало нереченную выход из системы.
Мой вопрос, это то, что я делаю, если во время пользовательского вызова функции выхода из системы, сокет на самом деле бросает исключение.
Пример - Конечные пользовательские вызовы функции вызовы вызовов, и хотя функция выхода в систему ожидает существующих запросов, в которых необходимо закончить, сокет бросает исключение в потоке для чтения.
У меня есть два варианта, когда я вижу это -
Притворись, что ошибка не произошла, и просто действовать как разъем, отключенный как часть нашей выхода.
Когда появляется исключение сокета, см. В разделе «Запрос выхода из системы», и, если это так, переопределите его. В результате первоначального запроса выхода выхода бросает alreadyloggedOutexception, а также отдельное событие выхода из системы, которое проходит исключение в logouteventargs.
Также, слегка связано - что я должен делать, если сервер инициирует выключение, которое не было запрошено (то есть .. Чтение вызова возвращается NULL) ..NET Messenger Server имеет тенденцию сделать это, если вы отправите запрос не нравится Я относится к этому как исключение в себе?
Я нашел все отключение / регистрацию из моей библиотеки, чтобы быть главным шипом на моей стороне. Я просто не могу казаться головой вокруг него. Кто-нибудь знает о любом открытом исходном коде приложения, которые красиво обрабатывают эту ситуацию?
Я пытался заняться этой вещью в моей голове так долго, это сводит меня с ума.
Решение
Я решил не передавать SocketException к конечному пользователю, так как отключение не является действительно исключением и должно быть ожидается и рассмотрено. Вместо этого есть свойство logoutreason на logouteventargs, который указывает, почему произошло выхода.
Я решил, что если отключение происходит во время выхода, то это не является исключением, так как выходит в систему в любом случае. Я просто игнорирую исключение в этом случае.