ThreadPool.QueueUserWorkItem和委托BeginInvoke之间有区别吗?

时间:2013-04-27 12:42:18

标签: c# asynchronous

我需要高效(使用尽可能少的线程)异步的计算方式(我使用.net 4)。 一种方法是

ThreadPool.QueueUserWorkItem(f => job.DoWork()); 
job.Completed += (a, b) => {...} //Completed is event I fire when work is done

另一种可能性是在C#v.5之前实现as done的异步方法,它基本上是在委托上调用BeginInvoke

我的问题是:除了不同的语法之外,这两者之间是否存在差异,因为似乎BeginInvoke也在使用来自ThreadPool的新主题?

顺便说一句:是否可以在与调用者相同的线程上异步定义和调用方法(如在javascript中所做的那样)(在任何版本的C#中)?

3 个答案:

答案 0 :(得分:1)

没有比建议你阅读Joseph Albahari(部分免费)关于Threading in C#的书更好的答案了。

  

Asynchronous delegates

     

ThreadPool.QueueUserWorkItem不提供简单的机制   完成后从线程返回返回值   执行。异步委托调用(异步委托   简而言之,解决这个问题,允许任意数量的类型化参数   两个方向都过去了。此外,未处理的例外   异步委托可以方便地在原始代理上重新抛出   线程(或更准确地说,调用EndInvoke的线程),等等   他们不需要明确处理。

答案 1 :(得分:1)

Delegate.BeginInvoke将该方法放在ThreadPoolBeginInvoke的优点是您可以使用IAsyncResult,它可用于监视异步调用的进度。它的“兄弟”方法EndInvoke检索异步调用的结果。它可以在BeginInvoke之后的任何时间调用。如果异步调用尚未完成,EndInvoke将阻塞调用线程,直到完成。

请参阅:http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

答案 2 :(得分:1)

我会看一下Task Parallel LibraryTask class。任务并行库(TPL)提供循环的并行执行,Task类允许您控制任务应执行的线程,这对UI操作很重要。