c# - 任务中的异步套接字操作

标签 c# .net sockets asynchronous task-parallel-library

我有一个 Threading.Tasks.Task 来处理许多客户端套接字操作(连接、接收和发送)。

我知道在可能的情况下,最好使用 Await 来使用非阻塞方法,否则我将以“停放的线程等待它们的响应”而告终。但是,虽然 Socket 类具有异步方法(SendAsync 等),但它们与通常的任务并行库异步方法不同,它们不返回任务且无法等待。

我意识到我可以用 TaskCompletionSource 包装这些套接字异步方法,但这样做有什么好处,还是它最终仍会停放线程?

最佳答案

正如 Servy 所解释的那样。只要您正确使用异步模式,使用 TaskCompletionSource 本身不会创建(或停放)任何线程。

.Net 框架中有 3 种不同的异步模式:

  1. Asynchronous Programming Model (APM) .
  2. Event-based Asynchronous Pattern (EAP) .
  3. Task-based Asynchronous Pattern (TAP) .

您要实现的是将一种模式(EAP)“转换”为另一种模式(TAP)。一个更简单的解决方案是使用 .Net 的内置“转换”从 APM 模式到 TAP,Task.Factory.FromAsync (内部使用 TaskCompletionSource):

应用程序管理

socket.BeginConnect(host, port, asyncResult =>
{
    socket.EndConnect(asyncResult);
    Console.WriteLine("Socket connected");
}, null);

点击

await Task.Factory.FromAsync(socket.BeginConnect, socket.EndConnect, host, port, null);
Console.WriteLine("Socket connected");

关于c# - 任务中的异步套接字操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25814575/

相关文章:

c# - 值类型的对象扩展方法

c# - 如何将 SqlException 消息操作为用户友好的消息

c# - 内部构造器

c# - 获取连接的 TcpClient 的远程端口

java - 解析 SMTP 中的实际电子邮件地址

c# - 如何将多个 linq 查询组合成一个结果集?

c# - 以非通用方式绑定(bind) Ninject Factory Extension 后出现异常

.net - 使用 LINQ 在标记元素处拆分列表?

.net - 如何使用 Image Magick 以相同的方式使用 Magick.net 设置配置文件?

c - 我如何了解这个不寻常角色的值(value)?里面有数字的方阵