Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当字典可能会调整大小时,我可以并行分配给该字典吗?_C#_.net_Dictionary_Parallel Processing - Fatal编程技术网

C# 当字典可能会调整大小时,我可以并行分配给该字典吗?

C# 当字典可能会调整大小时,我可以并行分配给该字典吗?,c#,.net,dictionary,parallel-processing,C#,.net,Dictionary,Parallel Processing,根据这里的另一个答案: 这表明我不能同时分配给字典。我从来没有遇到过分配给收藏和担心其自身规模扩大的问题 如果我从这个答案出发,我想它说我不能做这个做作的例子: Dictionary<int,int> foo = GetFoo(); var bar = new Dictionary<int,int>(); Parallel.ForEach(foo, bat=> { bar[bat.Key] = bat.Value } Dictio

根据这里的另一个答案:

这表明我不能同时分配给字典。我从来没有遇到过分配给收藏和担心其自身规模扩大的问题

如果我从这个答案出发,我想它说我不能做这个做作的例子:

Dictionary<int,int> foo = GetFoo();
var bar = new Dictionary<int,int>();

Parallel.ForEach(foo, bat=>
    {
        bar[bat.Key] = bat.Value
    }
Dictionary foo=GetFoo();
var bar=新字典();
Parallel.ForEach(foo,bat=>
{
棒[bat.Key]=棒值
}
这使得对字典的分配并行进行,因为基础集合
bar
可能会根据需要调整自身大小

这与Jon skeet的平行作业讨论非常相似:


在我看来,在上述情况下,我不需要使用
ConcurrentDictionary
,但我链接的答案(来自我尊敬的一位著名用户)表明情况并非如此

按照我描述的方式使用
字典
集合安全吗?还是会失败

有人能提供一个这样的赋值失败的代码示例吗?我正在尝试识别SLaks和Jon Skeet的答案,这两个例子都是并行地探索赋值到
字典


编辑投票人能解释我如何改进我的问题吗?如果我问的问题不清楚,请解释我如何澄清。谢谢。

你不能同时分配到字典,因为字典类的作者说它不是线程安全的。关于为什么这样做的细节对讨论并不十分重要

如果您是从静态字典中读取,那么您可以从多个线程中读取,因为没有任何读取选项可以修改基础字典,但是多个线程中的任何更新都是安全的

如果您想知道具体原因,请随意浏览并查看并发更新可能失败的原因,但通常最好使用“算法实现者”一词,因为更安全的做法是假设其他人的逻辑是用并发编写的,因为它不支持并发编写


多个写入失败的最简单示例是第352/353行,它们是(不太明显的)在这个方法的热路径中,需要复制一个值,然后再增加它。

是的;你不能这样做。你为什么要这样做呢?即使它是完全预先确定大小的,从多个线程写入字典也是不安全的。试着写下hashmap插入的伪代码,你就会明白为什么了(涉及多个步骤,每个步骤取决于前一步骤中未更改的共享数据)@SLaks这是一个非常做作的示例,但是完全合理的是,由于DI的原因,对字典的赋值可能会被不同的线程调用。但是,您可以对事先创建的键/值对执行任何需要的逻辑,并在准备添加该对时简单地
锁定字典。限制锁定分配键/值对的简单动作。我希望我说得有道理。“我觉得我不需要使用ConcurrentDictionary…”为什么?你只是读到你需要的。