我需要高效(使用尽可能少的线程)异步的计算方式(我使用.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#中)?
答案 0 :(得分:1)
没有比建议你阅读Joseph Albahari(部分免费)关于Threading in C#的书更好的答案了。
ThreadPool.QueueUserWorkItem不提供简单的机制 完成后从线程返回返回值 执行。异步委托调用(异步委托 简而言之,解决这个问题,允许任意数量的类型化参数 两个方向都过去了。此外,未处理的例外 异步委托可以方便地在原始代理上重新抛出 线程(或更准确地说,调用EndInvoke的线程),等等 他们不需要明确处理。
答案 1 :(得分:1)
Delegate.BeginInvoke
将该方法放在ThreadPool
。 BeginInvoke
的优点是您可以使用IAsyncResult
,它可用于监视异步调用的进度。它的“兄弟”方法EndInvoke
检索异步调用的结果。它可以在BeginInvoke
之后的任何时间调用。如果异步调用尚未完成,EndInvoke
将阻塞调用线程,直到完成。
答案 2 :(得分:1)
我会看一下Task Parallel Library和Task class。任务并行库(TPL)提供循环的并行执行,Task类允许您控制任务应执行的线程,这对UI操作很重要。