我正在读汉斯的“https://stackoverflow.com/questions/3172773/net-threadpool-worker-threads-and-asynchronous-io-threads”和“答案”,但我仍然需要澄清。
AFAIK,
异步方法的目的是允许多个任务在少数线程上运行;而异步委托的目的是与调用方并行执行任务。
但是对于这两个异步操作:
如果BeginInvoke立即返回给调用者(并且它使用异步委托),那么必须有其他线程在它完成时实际执行任务和信号。
那么,将该线程用于常规线程池线程有什么区别呢?我的回答是:只有那些线程池线程已经存在并等待运行了吗?
但是,当BeginInvoke立即运行并返回时,其他人实际上已经完成了肮脏的工作(代码必须在进程中的线程下运行),这一事实又如何呢?因此,必须在某个地方创建一个线程(在beginXXX调用之后运行)
我遗漏了什么?
发布于 2013-03-12 08:20:11
Delegate.BeginInvoke使用线程池线程,就像QueueUserWorkItem一样。不同之处在于它实现了APM模式,它允许调用方使用WaitHandle等待调用完成,并提供回调。
在许多地方都可以找到开始/结束方法对(AKA,异步编程模型),当调用'begin‘时,完全由实现者来决定发生了什么。在许多情况下,使用IO完成端口,这是等待IO完成的一种非常有效的方法。当IO完成时,一个线程池线程被用来执行回调,但是它是从线程池的另一个部分获取的(这就是Set{Min,Max}线程有两个数字的原因。)
另外,在.NET 4.5 (甚至4.0)中,使用异步任务要容易得多。许多类都使用了像'XXXTaskAsyc‘这样的方法来增强,后者返回一个Task对象。
https://stackoverflow.com/questions/15356074
复制相似问题