В этом конкретном случае я пишу сервер TCP / IP и использую TcpListener.BeginAcceptTcpClient () для приема входящих соединений. Логика сервера реализована в одном классе, реализующем интерфейс IDisposable: когда вызывается Dispose (), я хочу отменить операцию BeginAcceptTcpClient ().
Теперь в более общих чертах: как использовать отмену операций при использовании модели асинхронного ввода-вывода .NET (Begin * и End *)?
Моя идея была бы примерно такой:
private volatile bool canceledFlag = false;
this.listener.BeginAcceptTcpClient(asyncResult =>
{
if(this.canceledFlag) return;
// ...
}, null);
Dispose () установит для флага значение true и также вызовет this.listener.Stop ().
Однако я вспоминаю, что прочитал, что для каждого вызова Begin * должен быть соответствующий вызов End *, иначе могут произойти плохие события.
Так как мне тогда это сделать? Обратите внимание, что я ищу общее решение для отмены с помощью методов Begin * и End * - я просто дал вам конкретный сценарий использования, чтобы помочь вам понять мой вопрос.