请注意,我知道Parallel.Invoke()用于任务同步。我的问题是:
有没有办法使用Parallel.Invoke之类的东西调用匿名方法,其中调用不等待执行完成?
我认为并行执行(或并行调用)的重点是不必等待任务完成。如果你想等待一段代码完成执行,而不是使用Parallel.Invoke,为什么不直接调用代码呢?我想我只是不明白Parallel.Invoke的意思。文档只是说它做了什么,但没有提到任何用例,这比直接调用代码更有用。
答案 0 :(得分:9)
如果你想等待一段代码完成执行,而不是使用Parallel.Invoke,为什么不直接调用代码?
通常情况下,您可以通过多项工作致电Parallel.Invoke
。如果你连续执行这些工作,它(可能)需要比并行执行它们更长的时间。
“并行执行”与“在后台执行”不同 - 您似乎正在寻找后者,但这不是Parallel.Invoke
的内容。
如果您只想启动任务,请使用Task.Run
(或.NET 4.5之前的Task.Factory.StartNew
)。 Parallel.Invoke
专门用于执行并行的一系列操作,但随后等待这些并行操作完成。
作为一个具体示例,您可以通过分区执行排序,然后并行地递归排序枢轴的两侧。这样做会使用多个核心,但您通常仍希望等到整个排序完成后再继续。
答案 1 :(得分:6)
如果您不想等待完成,只需将Parallel.Invoke
来电包裹在Task
。
Task.Factory.StartNew( () =>
{
Parallel.Invoke( <one or more actions> );
} );
答案 2 :(得分:4)
你在找这样的东西吗?
async Task ParallelInvokeAsync(Action[] actions)
{
var tasks = actions.Select(a => Task.Run(a));
await Task.WhenAll(tasks);
}
后台执行:
ParallelInvokeAsync(actions);
MessageBox.Show("I'm working");
带阻塞的后台执行,与Parallel.Invoke
非常相似:
ParallelInvokeAsync(actions).Wait();
MessageBox.Show("I'm dome working");