异步调用是否需要当前进程中的额外线程或使用线程池中的另一个线程?

时间:2010-09-17 09:14:56

标签: c# .net multithreading asynchronous threadpool

我指的是this答案,它说它不是必需的,但是几乎没有具体的假设。这个问题很笼统。

  • 我正在使用C#
  • 异步进程除了调用外部API并等待回复外什么都不做。

3 个答案:

答案 0 :(得分:3)

你的问题太笼统了。 Windows API在不使用线程的情况下对异步I / O提供特定支持,例如,检查ReadFile()的文档。 lpOverlapped参数控制它。 ReadFileEx()函数允许指定I / O完成回调。这完全由.NET框架类覆盖。

此机制不支持调用缓慢的外部API函数,您需要启动自己的线程。

答案 1 :(得分:3)

一般来说是的,但至少有一个我能想到的例外。要启动异步操作,您必须在调用者的上下文之外传输操作。我的意思是调用者不应该阻止等待操作完成。 通常是意味着操作必须移动到新创建的线程,来自ThreadPool的线程,IO完成端口,另一个进程等。

我说有一个例外浮现在脑海中。如果我们稍微颠覆我们对异步的定义,我们可以允许启动器不阻止等待操作完成而不实际将操作移动到另一个线程的情况。最好的例子是UI消息泵。在.NET中,从UI线程本身调用Control.BeginInvoke以在同一线程上发布委托的执行是很容易的。启动器显然不会阻止等待委托完成,但委托最终会在同一个线程上开始执行。这绝对是我们通常认为的术语“异步”的一种变态,因为在这种情况下,操作会阻塞,直到调用者完成而不是相反。

答案 2 :(得分:2)

是的,使用了池线程。但是那个线程并没有等待外部设备。重新使用该线程,并在I / O完成时调用(另一个)线程。

请参阅MSDN上的I/O Asynchronous Completion