C# 是否应该等一等?

C# 是否应该等一等?,c#,asynchronous,task-parallel-library,C#,Asynchronous,Task Parallel Library,这里发生了一件奇怪的事情。我认为是平行的。Foreach会等到所有任务完成后再继续。但是,我有这样的想法: List<string> foo(List<A> list){ Dictionary<string, bool> dictionary = new Dictionary<string, bool>(); Parallel.Foreach(list, element => { dictionary[

这里发生了一件奇怪的事情。我认为是平行的。Foreach会等到所有任务完成后再继续。但是,我有这样的想法:

List<string> foo(List<A> list){
    Dictionary<string, bool> dictionary = new Dictionary<string, bool>();
    Parallel.Foreach(list, element =>
    {
        dictionary[element.Id] = true;
        if (element.SomeMethod()){
            dictionary[element.Id] = false;
        }
    });

    List<string> selectedIds = (from element in list where !dictionary[element.Id] select element.Id).ToList();
    return selectedIds;
}
List foo(列表){
字典=新字典();
Parallel.Foreach(列表,元素=>
{
字典[element.Id]=true;
if(element.SomeMethod()){
字典[element.Id]=false;
}
});
List selectedds=(来自列表中的元素,其中!dictionary[element.Id]select element.Id).ToList();
返回所选的ID;
}

然后我在选择行中得到System.Collections.Generic.KeyNotFoundException(有时,不总是)。如您所见,我正在为每个可能的键(列表元素的ID)初始化字典,然后得到这个异常,这使我认为这一行可能在并行执行之前到达。Foreach完成。。。是这样吗?如果是这样,我如何等待这个Parallel.Foreach的所有分支完成?

Parallel.Foreach
不需要等待,因为它不返回任务,也不是异步的。当对该方法的调用完成时,迭代已经完成

但是,
Parallel.Foreach
同时使用多个线程,
Dictionary
不是线程安全的

您可能手头有一个竞争条件,应该改用线程安全的
concurrentdirectionary


通过使用PLinq的
AsParallel
,可以以更简单的方式解决此特定情况:

list.AsParallel().Where(element => !element.SomeMethod());

Parallel.Foreach
不需要等待,因为它不返回
任务,也不是异步的。当对该方法的调用完成时,迭代已经完成

但是,
Parallel.Foreach
同时使用多个线程,
Dictionary
不是线程安全的

您可能手头有一个竞争条件,应该改用线程安全的
concurrentdirectionary


通过使用PLinq的
AsParallel
,可以以更简单的方式解决此特定情况:

list.AsParallel().Where(element => !element.SomeMethod());

我的经验和我看到的所有样本,如果主线程阻塞,直到工作是fnishedConcurrentDictionary!下面的plink示例更具可读性,我的经验和我看到的所有示例都表明,如果主线程阻塞,直到工作完成fnishedConcurrentDictionary!下面的plink示例是一个大的例子,它也更具可读性