Asynchronous network programming with async/await(使用 async/await 进行异步网络编程)
问题描述
在过去的几年中,我使用异步编程模型和套接字开发了客户端/服务器软件.这个 example 在 MSDN 上,虽然过于复杂使用 ManualResetEvents 等同步机制说明了这些概念:您使用 BeginXXX()
和 EndXXX()
方法对进行连接和流操作.
For the past few years, I've developed client/server software using the Asynchronous Programming Model and sockets. This example on MSDN, although overcomplicated with synchronisation mechanisms such as ManualResetEvents, illustrates the concepts: you use a BeginXXX()
and EndXXX()
method pair for the connection and stream operations.
这样做的好处是让线程池根据需要(例如,当接收到数据时)分配线程,而不是每个连接都有一个专用线程,这无法扩展.
This has the advantage of letting the thread pool assign threads as needed (e.g. when data is received) rather than having a dedicated thread per connection, which doesn't scale.
最近有人提到,这种方法也可以使用 .NET 4.5 中引入的 async/await 模型来实现,因此在这种情况下使用 Tasks 并使 APM 变得不必要.这是怎么做到的?
Someone recently mentioned that this approach can also be achieved using the async/await model introduced in .NET 4.5, thus using Tasks and making the APM unnecessary for this scenario. How is this done?
推荐答案
其实Socket
类支持的老APM使用了一个特殊的线程池,IOCP("I/O Completion Port") 线程池,而不是在接收到数据时"分配线程,实际上分配线程作为 I/O 操作是启动,但是以允许单个线程(或少量线程)的方式…例如,与系统上的内核一样多)来处理大量的套接字对象和操作.
Actually, the old APM supported by the Socket
class used a special thread pool, the IOCP ("I/O Completion Port") thread pool, and rather than assigning threads "when data is received", actually assigned threads as I/O operations are initiated, but in a way that allows a single thread (or small number of threads…e.g. as many as there are cores on the system) to handle a large number of socket objects and operations.
至于如何使用新的 async
/await
风格的 API,不幸的是 Socket
类没有得到任何直接的 异步
爱.然而,所有的包装器都做到了.最直接的替代方法是使用 NetworkStream
类,并使用 ReadAsync()
和 WriteAsync()
,它们是可等待的方法.
As far as how to use the new async
/await
style API, unfortunately the Socket
class didn't get any direct async
love. However, all of the wrappers did. The most straight-forward replacement is to use the NetworkStream
class, and use ReadAsync()
and WriteAsync()
, which are awaitable methods.
如果您仍想直接(基本上)使用 Socket
API,您必须自己使用可等待的实现来包装它.恕我直言,这里有一个很好的资源来解释这样做的一种可能方法:等待套接字操作
If you want to still use the Socket
API (essentially) directly, you'll have to wrap it yourself with an awaitable implementation. IMHO, a very good resource explaining one possible approach for doing this is here: Awaiting Socket Operations
这篇关于使用 async/await 进行异步网络编程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 async/await 进行异步网络编程
基础教程推荐
- c# Math.Sqrt 实现 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30