0

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

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

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

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

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

4

3 回答 3

1

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

异步委托

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

于 2013-04-27T12:45:58.577 回答
1

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

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

于 2013-04-27T12:50:05.940 回答
1

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

于 2013-04-27T12:56:29.650 回答