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

Ans*_*hul 8 c# parallel-processing multithreading task-parallel-library

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

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

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

Jon*_*eet 10

如果你想等待一段代码完成执行,而不是使用Parallel.Invoke,为什么不直接调用代码呢?

通常你会打电话Parallel.Invoke给多件工作.如果你连续执行这些工作,它(可能)比并行执行它们需要更长的时间.

"并行执行"与"在后台执行"不同 - 您似乎正在寻找后者,但这不是什么意思Parallel.Invoke.

如果您只想启动任务,请使用Task.Run(或Task.Factory.StartNew在.NET 4.5之前).Parallel.Invoke专门用于并行执行一系列操作,然后等待这些并行操作完成.

作为一个具体示例,您可以通过分区执行排序,然后并行递归地对枢轴的两侧进行排序.这样做会使用多个内核,但是在进行之前,您通常仍希望等到整个排序完成.

  • @Anshul:并行执行只是使用多个核来实现目标.*可以*以"火与忘"的方式完成,但并非总是如此.请参阅我的编辑,了解何时将工作并行化而不将其作为后台任务的有用示例. (2认同)
  • @Anshul`Parallel.Invoke(action1,action2);`两个动作将并行运行但*Parallel.Invoke*将等待它们两个完成.假设他们的执行时间是`t1`和`t2`.`Parallel.Invoke`将等待`max(t1,t2)`秒. (2认同)

Moh*_*oho 6

如果您不想等待完成,只需将您的Parallel.Invoke电话打包Task.

Task.Factory.StartNew( () =>
    {
        Parallel.Invoke( <one or more actions> );
    } );
Run Code Online (Sandbox Code Playgroud)


nos*_*tio 5

你在寻找这样的东西吗?

async Task ParallelInvokeAsync(Action[] actions)
{
    var tasks = actions.Select(a => Task.Run(a));
    await Task.WhenAll(tasks);
}
Run Code Online (Sandbox Code Playgroud)

后台执行:

ParallelInvokeAsync(actions); 
MessageBox.Show("I'm working");
Run Code Online (Sandbox Code Playgroud)

带阻塞的后台执行,非常类似于Parallel.Invoke

ParallelInvokeAsync(actions).Wait(); 
MessageBox.Show("I'm dome working");
Run Code Online (Sandbox Code Playgroud)