Я пишу библиотеку мгновенных сообщений. В настоящее время, когда SocketException вызывается во время чтения или записи в сокет, я запускаю процедуру выхода изнутри приложения, передавая SocketException конечному пользователю в качестве аргумента LogoutEventArgs. Это дает конечному пользователю возможность увидеть, какое именно исключение вызвало незапрошенный выход из системы.
Мой вопрос: что мне делать, если при вызове пользователем функции Logout сокет фактически выдает исключение.
Пример. Конечный пользователь вызывает функцию выхода из системы, и пока функция выхода из системы ожидает элегантного завершения существующих запросов, сокет создает исключение в потоке чтения.
У меня есть два варианта, как я вижу -
Притворитесь, что ошибка не произошла, и просто действуйте, как сокет, отсоединенный как часть нашего выхода из системы.
Когда генерируется исключение для сокета, проверьте, выполняется ли запрос на выход из системы, и если это так, отмените его. В результате исходный запрос выхода из системы выдает исключение AlreadyLoggedOutException, а также отдельное событие выхода из системы, которое передает исключение в LogoutEventArgs.
Кроме того, немного связано - что мне делать, если сервер инициирует завершение работы, которое не было запрошено (т. Е. Вызов read возвращает ноль). Сервер .NET Messenger имеет тенденцию делать это при отправке запрос это не нравится. Я рассматриваю это как исключение само по себе?
Я обнаружил, что вся часть, связанная с отключением / выходом из моей библиотеки, была главным занудством на моей стороне. Я просто не могу обернуть голову вокруг этого. Кто-нибудь знает о каких-либо приложениях с открытым исходным кодом, которые прекрасно справляются с этой ситуацией?
Я так долго пытался взяться за эту вещь в моей голове, это сводит меня с ума.