Я создал библиотеку Messenger, и я сделал ее потокобезопасной, поэтому ее можно обменивать между потоками, не беспокоясь. В основном я использую класс Monitor.Путаница о синхронизации потоков, когда два потока вызывают один и тот же метод
У меня есть процедура Logout, которая может занять некоторое время, потому что она пытается дождаться транзакций, прежде чем она выключит сокет и т. Д. Она асинхронна и имеет методы Begin/End, но для этого примера мы просто притворитесь, что это синхронно.
Что делать, если два потока вызывают выход из системы, один за другим? Что мне делать со вторым потоком?
В настоящее время я блокирую (используя Monitor.Wait, чтобы ждать Pulse от первого потока), пока первый выход не завершится, а затем выбросить AlreadyLoggedOutException.
Я также играл с созданием исключения LogoutInProgress, если вызывается Logout, но выход из системы уже происходит.
Оба, похоже, имеют преимущества и недостатки, но я хотел бы знать, что лучше всего думают другие люди.
Асинхронная сторона этого не имеет значения. То, что вы говорите, что метод Logout должен просто вернуть (void) для обоих из них ПОСЛЕ выхода из системы без каких-либо исключений? – NoPyGod
Если оба они намереваются выйти из одного клиента, а операция идемпотентна, тогда нет смысла бросать исключение. –
Логика с исключением имеет смысл. Но вы действительно считаете, что оба выхода из системы должны «блокироваться» до тех пор, пока не завершится фактический выход из системы? Теоретически я мог бы просто вернуться со второго выхода из системы, так как в какой-то момент завершение кулака будет успешным. Проблема, которую я вижу в этом, заключается в том, что она дала бы вызывающей стороне иллюзию завершения Logout, когда она все еще имеет место. – NoPyGod