C#/ .NET中的每个异步API调用是否在后台使用单独的线程?

问题描述 投票:0回答:2

我的应用程序接受许多并发tcp连接,每当连接客户端时我都会调用socket.BeginReceive(...)socket.ReceiveAsync(SocketAsyncEventArgs e)。我想知道我的所有BeginReceive()调用是由一个线程处理还是每个调用由不同的后台线程处理?

c# .net multithreading sockets asynchronous
2个回答
1
投票

多个并发异步调用不会打开多个后台线程,如blog.stephencleary.com/2013/11/there-is-no-thread.html中所述。

所有功劳都归功于@Evk,建议此链接和链接的原作者。


0
投票

答案是否定的,您可以阅读以下内容。

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传输到线程池的工作分开。

© www.soinside.com 2019 - 2024. All rights reserved.