2

我正在阅读汉斯的这个问题和答案,但我仍然需要澄清。

AFAIK ,

异步方法的目的是让许多任务在少数线程上运行;而异步委托的目的是与调用者并行执行任务。

但是关于这两个异步操作:

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

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

但是,当BeginInvoke运行并立即返回时,其他实际上已经完成了肮脏的工作(并且代码必须在正在处理的线程下运行。)所以必须在某个地方创建线程(在 beginXXX 之后运行)称呼)

我错过了什么?

4

2 回答 2

2

Delegate.BeginInvoke使用线程池线程,就像QueueUserWorkItem. 不同之处在于它实现了 APM 模式,允许调用者使用 aWaitHandle等待调用完成,并提供回调。

Begin/End 方法对(AKA 异步编程模型)可以在很多地方找到,完全由实现者决定调用“begin”时会发生什么。很多情况下都会用到一个IO完成端口,这是一种非常高效的等待IO完成的方式。当 IO 完成时,线程池线程用于执行回调,但它取自线程池的不同部分(这就是为什么 Set{Min,Max}Threads 有两个数字。)

附带说明一下,在 .NET 4.5(甚至 4.0)中,使用 Tasks 进行异步要容易得多。许多类都增加了诸如“XXXTaskAsyc”之类的返回Task对象的方法。

于 2013-03-12T08:20:11.287 回答
1

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

于 2013-03-12T08:13:43.980 回答