Parallel.Invoke()无需等待执行完成

时间:2014-01-29 20:27:48

标签: c# multithreading parallel-processing task-parallel-library

请注意,我知道Parallel.Invoke()用于任务同步。我的问题是:

有没有办法使用Parallel.Invoke之类的东西调用匿名方法,其中调用不等待执行完成?

我认为并行执行(或并行调用)的重点是不必等待任务完成。如果你想等待一段代码完成执行,而不是使用Parallel.Invoke,为什么不直接调用代码呢?我想我只是不明白Parallel.Invoke的意思。文档只是说它做了什么,但没有提到任何用例,这比直接调用代码更有用。

3 个答案:

答案 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");