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
取消排队?这对我来说似乎很奇怪。