C# 并发子结构是否需要并发?

C# 并发子结构是否需要并发?,c#,multithreading,data-structures,concurrency,C#,Multithreading,Data Structures,Concurrency,在多线程应用程序中,我必须实现一个ConcurrentDictionary 队列是否需要是ConcurrentQueue?有必要吗?我将在同一线程中对所有元素进行出列,因此我认为不会。我说得对吗? 编辑:我没有提到我在排队的不同线程中排队,所以我认为正确的结构应该是 字典。字典键仅在启动时编辑如果您仅更改传递给并发字典的AddOrUpdate()调用的updateValueFactory委托中的队列,则您可以保证每次只有一个线程访问队列对象,因此,在这种情况下,您不需要使用ConcurrentQ

在多线程应用程序中,我必须实现一个
ConcurrentDictionary
队列是否需要是
ConcurrentQueue
?有必要吗?我将在同一线程中对所有元素进行出列,因此我认为不会。我说得对吗? 编辑:我没有提到我在排队的不同线程中排队,所以我认为正确的结构应该是
字典
。字典键仅在启动时编辑

如果您仅更改传递给并发字典的
AddOrUpdate()
调用的
updateValueFactory
委托中的队列,则您可以保证每次只有一个线程访问
队列
对象,因此,在这种情况下,您不需要使用
ConcurrentQueue

例如,以下代码允许多个不同线程随时调用
Enqueue()
Dequeue()
,并将防止
concurrentdirectionary
中的任何单个
Queue
对象一次被多个线程访问:

    private static ConcurrentDictionary<string, Queue<string>> dict;

    public static void Main()
    {
        dict = new ConcurrentDictionary<string, Queue<string>>();
    }

    // If I do this on one thread...
    private static void Enqueue(string key, string value)
    {
        dict.AddOrUpdate(
            key,
            k => new Queue<string>(new[] { value }),
            (k, q) =>
                {
                    q.Enqueue(value);
                    return q;
                });
    }

    // And I do this on another thread...
    private static string Dequeue(string key)
    {
        string result = null;
        dict.AddOrUpdate(
            "key",
            k => new Queue<string>(),
            (k, q) =>
                {
                    result = q.Dequeue();
                    return q;
                });

        return result;
    }
私有静态并发字典dict;
公共静态void Main()
{
dict=新的ConcurrentDictionary();
}
//如果我在一个线程上执行此操作。。。
私有静态void排队(字符串键、字符串值)
{
dict.AddOrUpdate(
钥匙
k=>newqueue(new[]{value}),
(k,q)=>
{
q、 排队(值);
返回q;
});
}
//我在另一个线程上做这个。。。
私有静态字符串出列(字符串密钥)
{
字符串结果=null;
dict.AddOrUpdate(
“钥匙”,
k=>newqueue(),
(k,q)=>
{
结果=q.Dequeue();
返回q;
});
返回结果;
}

排队怎么样?在放入字典的
队列
上是否会有超过1个线程同时运行?只有在同时进行修改和读取操作时,字典才必须是并发的。在你的例子中是真的吗?在我的例子中,我有一个线程来填充字典并将新数据排队到子队列中;然后多个线程将数据出列,但只针对选定的键。mmmm可能我做的与我应该做的相反:)也许使用字典更好?应用程序运行时,字典键只修改一次start@Andrew卡塔尼奥:是的,应该是相反的。使用
AddOrUpdate
取消排队?这对我来说似乎很奇怪。