c# - .NET 取消异步 I/O 操作

标签 c# .net asynchronous io

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

现在更笼统地说:当使用 .NET 的异步 I/O 模型(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* 方法取消的通用解决方案 - 我只是向您提供了我的具体使用场景,以帮助您理解我的问题。

最佳答案

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

对于 TcpListener,使用 Server.Dispose(),比调用 Stop() 效率更高一些。

关于c# - .NET 取消异步 I/O 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7378320/

相关文章:

c# - NativeWindow 等效项

c# - 你如何设置 ApiController.User

c# - 简单的数据库处理

c# - 在 C# 中访问交换电子邮件

c# - .NET WebClient - 上传数据并获取流

javascript - promise 谜题

从客户端套接字读取时的C#AsyncSockets递归

c# - 用C#更改按下的键

c# - MSIL 代码中的变量作用域/重用

c# - 寻找 C# 中不同类型用户输入的数组列表声明的良好实践