我正在阅读this question并由Hans回答,但我仍需要澄清。
AFAIK,
异步方法的目的是允许运行许多任务 几个线程;而异步委托的目的是执行a 任务与调用者并行。
但是关于两个异步操作:
如果BeginInvoke
将立即返回给调用者(,它与异步委托一起),那么必须有其他线程实际完成这项工作,完成时发出信号。
那么将那个线程用于常规线程池线程有什么区别? 我回答:只有那些线程池线程已经存在并等待运行的事实?
但是,当BeginInvoke
运行并立即返回时,某人 else 实际上已经执行了脏任务(并且代码必须在正在处理的线程下运行)。 )所以必须某处创建一个线程(在beginXXX调用之后运行)
我错过了什么?
答案 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了解相关信息。