ConcurrentDictionary<string,ArrayList> AddOrUpdate 错误
ConcurrentDictionary<string,ArrayList> AddOrUpdate error
我偶然发现了以下障碍。我需要一个 ConcurrentDictionary ,它以字符串为键,以 ArrayList 为值。我想按以下方式使用 AddOrUpdate:
using System.Collections;
using System.Collections.Concurrent;
private ConcurrentDictionary<string, ArrayList> _data= new ConcurrentDictionary<string, ArrayList>();
private void AddData(string key, string message){
_data.AddOrUpdate(key, new ArrayList() { message }, (string existingKey, string existingList) => existingList.Add(message));
}
但是此方法不起作用并抛出以下错误:
Compiler Error CS1661: Cannot convert anonymous method block to delegate type 'delegate type' because the specified block's parameter types do not match the delegate parameter types
总之,我正在尝试执行以下操作:
- 尝试将消息添加到 ConcurrentDictionary 中的数组列表。
- 如果 arraylist 不存在,请创建一个包含消息的新数组。
- 如果 arraylist 确实存在,只需将其添加到数组的末尾即可。
所以我的问题是,如何修复此错误并改进我的代码,我做错了什么?
正确的线程安全方式是:
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
private ConcurrentDictionary<string, List<string>> _data = new ConcurrentDictionary<string, List<string>();
private void AddData(string key, string message){
var list = _data.GetOrAdd(key, _ => new List<string>());
lock(list)
{
list.Add(message);
}
}
我偶然发现了以下障碍。我需要一个 ConcurrentDictionary
using System.Collections;
using System.Collections.Concurrent;
private ConcurrentDictionary<string, ArrayList> _data= new ConcurrentDictionary<string, ArrayList>();
private void AddData(string key, string message){
_data.AddOrUpdate(key, new ArrayList() { message }, (string existingKey, string existingList) => existingList.Add(message));
}
但是此方法不起作用并抛出以下错误:
Compiler Error CS1661: Cannot convert anonymous method block to delegate type 'delegate type' because the specified block's parameter types do not match the delegate parameter types
总之,我正在尝试执行以下操作:
- 尝试将消息添加到 ConcurrentDictionary 中的数组列表。
- 如果 arraylist 不存在,请创建一个包含消息的新数组。
- 如果 arraylist 确实存在,只需将其添加到数组的末尾即可。
所以我的问题是,如何修复此错误并改进我的代码,我做错了什么?
正确的线程安全方式是:
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
private ConcurrentDictionary<string, List<string>> _data = new ConcurrentDictionary<string, List<string>();
private void AddData(string key, string message){
var list = _data.GetOrAdd(key, _ => new List<string>());
lock(list)
{
list.Add(message);
}
}