.NET取消异步I/O操作

Shd*_*dNx 4 .net c# io asynchronous

在这种特殊情况下,我正在编写TCP/IP服务器,而我正在使用TcpListener.BeginAcceptTcpClient()来接受传入连接.服务器逻辑在实现IDisposable接口的单个​​类中实现:当调用Dispose()时,我想取消BeginAcceptTcpClient()操作.

现在用更一般的术语来说:当使用.NET 的异步I/O模型(Begin*和End*)时,如何取消操作?

我的想法是这样的:

private volatile bool canceledFlag = false;

this.listener.BeginAcceptTcpClient(asyncResult =>
{
    if(this.canceledFlag) return;

    // ...
}, null);
Run Code Online (Sandbox Code Playgroud)

Dispose()会将标志设置为true,并且还会调用this.listener.Stop().但是我记得已经读过,对于每个Begin*调用必须有匹配的End*调用或者会发生不好的事情.

那我该怎么做呢?请注意,我正在寻找一个使用Begin*和End*方法取消的一般解决方案 - 我只是给了你具体的使用场景,以帮助你理解我的问题.

Han*_*ant 7

一般的解决方法是调用Close()或Dispose()的任何对象,其BeginXxxx()方法,你叫上.这将导致回调运行,当您调用EndXxxx()时,您将获得ObjectDisposedException.您应该将其视为"使用结束"信号,立即清理并退出回调.虽然不赞成,但流量控制的例外使用是不可避免的.

对于TcpListener,使用Server.Dispose(),比调用Stop()更有效.