繁体   English   中英

ThreadPool.QueueUserWorkItem和委托BeginInvoke之间有什么区别

[英]is there a difference between ThreadPool.QueueUserWorkItem and delegate BeginInvoke

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

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

另一种可能性是如实施异步方法完成之前,C#5节,这基本上是调用BeginInvoke上的委托。

我的问题是:除语法不同外,这两者之间是否有区别,因为BeginInvoke似乎也在使用ThreadPool的新线程?

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

没有比建议您阅读约瑟夫·阿尔巴哈里(Joseph Albahari)的(部分免费的)有关C#线程的书更好的答案了。

异步委托

ThreadPool.QueueUserWorkItem没有提供一种简单的机制来在完成执行后从线程获取返回值。 异步委托调用(简称异步委托)解决了这一问题,允许在两个方向上传递任意数量的类型化参数。 此外,异步委托上未处理的异常可以方便地在原始线程(或更准确地说,是调用EndInvoke的线程)上重新抛出,因此不需要显式处理。

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

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

我来看看Task Parallel LibraryTask类 任务并行库(TPL)提供了循环的并行执行,并且Task类允许您控制任务应在哪个线程中执行,这对于UI操作很重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM