C# 连接任务并行线程

C# 连接任务并行线程,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,我知道如何加入一个简单线程以使父线程等待它们,但我不知道如何为System.Threading.Tasks命名空间中实现的自动线程执行此操作。这里有一个例子。我在我的主函数中调用了两个我想分别执行的函数。每个函数内部都有一个parallel.for。现在我如何让主线程在调用第二个函数之前等待第一个函数的所有线程完成呢 static void Main(string[] args) { fill(); // now main should wait for threads of

我知道如何加入一个简单线程以使父线程等待它们,但我不知道如何为System.Threading.Tasks命名空间中实现的自动线程执行此操作。这里有一个例子。我在我的主函数中调用了两个我想分别执行的函数。每个函数内部都有一个parallel.for。现在我如何让主线程在调用第二个函数之前等待第一个函数的所有线程完成呢

static void Main(string[] args)
{
     fill();
     // now main should wait for threads of fill function to finish
     filter();
}

void filter()
{
     parallel.for(some action);
}

void fill()
{
    parallel.for(some action);
}
在多个线程之间进行内部分叉迭代,但随后它会阻塞,直到它们全部完成。因此,从主要功能的角度来看,您的代码是序列代码:

public static ParallelLoopResult For<TLocal>(
    int fromInclusive,
    int toExclusive,
    Func<TLocal> localInit,
    Func<int, ParallelLoopState, TLocal, TLocal> body,
    Action<TLocal> localFinally
)
我们对循环迭代进行分叉处理,并进行连接,以使并行循环调用 完成所有并发处理后完成

如果需要通过循环共享某些局部状态,请使用函数的版本:

public static ParallelLoopResult For<TLocal>(
    int fromInclusive,
    int toExclusive,
    Func<TLocal> localInit,
    Func<int, ParallelLoopState, TLocal, TLocal> body,
    Action<TLocal> localFinally
)

有关并行类如何与示例一起工作的深度信息,请阅读(Blackquote、图像和示例取自此处)

Parallel。对于
块,直到所有任务都完成为止…Parallel.For已从理论上连接。要等到所有的任务完成,我不确定。因为当我使用它时,我得到了冲突的结果,而当我使用正则for时,一切都正常!如果要启用“超线程”或解锁某些内核,则可以将这些操作放在同一个单并行中。否则这两种情况都不会改变总时间。如果您的结果与同步
for…
循环的预期一致,我会说您在并行循环中使用了一个共享资源。那不是个好主意。。因为锁定对它们的访问将基本上使其同步。理想情况下,您会使用
并行。对于
不相关的数据块。因此,为什么我会得到冲突的结果?问题可能在于循环体的内部结构。确保不要依赖某些共享资源。