我的应用程序接受许多并发tcp连接,每当连接客户端时我都会调用socket.BeginReceive(...)
或socket.ReceiveAsync(SocketAsyncEventArgs e)
。我想知道我的所有BeginReceive()
调用是由一个线程处理还是每个调用由不同的后台线程处理?
多个并发异步调用不会打开多个后台线程,如blog.stephencleary.com/2013/11/there-is-no-thread.html中所述。
所有功劳都归功于@Evk,建议此链接和链接的原作者。
答案是否定的,您可以阅读以下内容。
MSDN Asynchronous Programming with Async and Await (C# and Visual Basic)主题
异步方法旨在实现非阻塞操作。在等待任务运行时,异步方法中的await表达式不会阻止当前线程。相反,表达式将方法的其余部分作为延续进行注册,并将控制权返回给异步方法的调用者。
async和await关键字不会导致创建其他线程。异步方法不需要多线程,因为异步方法不能在自己的线程上运行。该方法在当前同步上下文上运行,并仅在方法处于活动状态时在线程上使用时间。您可以使用Task.Run将CPU绑定的工作移动到后台线程,但后台线程无助于只等待结果可用的进程。
在几乎所有情况下,基于异步的异步编程方法优于现有方法。特别是,对于IO绑定操作,此方法优于BackgroundWorker,因为代码更简单,您无需防范竞争条件。与Task.Run结合使用,异步编程优于BackgroundWorker用于CPU绑定操作,因为异步编程将运行代码的协调细节与Task.Run传输到线程池的工作分开。