异步代理操作澄清?

时间:2013-03-12 08:06:16

标签: c# asynchronous .net-4.0

我正在阅读this question并由Hans回答,但我仍需要澄清。

AFAIK,

  

异步方法的目的是允许运行许多任务   几个线程;而异步委托的目的是执行a   任务与调用者并行。

但是关于两个异步操作:

如果BeginInvoke立即返回给调用者(,它与异步委托一起),那么必须有其他线程实际完成这项工作,完成时发出信号。

那么将那个线程用于常规线程池线程有什么区别? 我回答:只有那些线程池线程已经存在并等待运行的事实?

但是,当BeginInvoke运行并立即返回时,某人 else 实际上已经执行了脏任务(并且代码必须在正在处理的线程下运行)。 )所以必须某处创建一个线程(在beginXXX调用之后运行)

我错过了什么?

2 个答案:

答案 0 :(得分:2)

Delegate.BeginInvoke使用线程池线程,就像QueueUserWorkItem一样。区别在于它实现了APM模式,允许调用者使用WaitHandle等待调用完成,并提供回调。

开始/结束方法对(AKA异步编程模型)可以在很多地方找到,完全由实施者来决定当你调用'begin'时会发生什么。在许多情况下,使用IO完成端口,这是等待IO完成的非常有效的方式。当IO完成时,线程池线程用于执行回调,但是它来自线程池的不同部分(这就是Set {Min,Max}线程有两个数字的原因。)

作为旁注,使用.NET 4.5(甚至4.0),使用Tasks进行异步操作要容易得多。许多类已经使用像'XXXTaskAsyc'这样的方法进行了扩充,它返回了一个Task对象。

答案 1 :(得分:1)

您似乎已经自己得到了答案:BeginInvoke使用Threadpool - 线程来完成工作。最后,似乎与自己将工作项排队到线程池没有任何不同。唯一的事情就是你所面临的更高层次的抽象。您实际上并不关心排队并在代码中明确提供回调 这已经被研究过了。请参阅此处SO了解相关信息。