ConcurrentDictionary是否可以在GetOrAdd之后编辑值?

时间:2014-04-29 20:27:39

标签: c# thread-safety task-parallel-library concurrentdictionary

我正在使用并发字典的GetOrAdd方法来检索值列表,然后引用我正在编辑它们的值列表。以这种方式进行线程安全吗?

我正在添加一个值的第一种方法和我正在清除列表的第二种方法。

using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
using Test.Web.Services;

namespace Test.Web.Messaging
{
    public class Dispatch
    {
        private static readonly ConcurrentDictionary<string, IList<Message>> Messages = new ConcurrentDictionary<string, IList<Message>>();

        public static void AddMessage(string id, Message value)
        {
            var msgs = Messages.GetOrAdd(id, new List<Message>());
            msgs.Add(value);
        }

        public static void Send(string id)
        {
             var msgs = Messages.GetOrAdd(id, new List<Message>());
             foreach (var msg in msgs)
             {
                 Connection.Send(id, msg);
             }
             msgs.Clear();
        }
    }
}

2 个答案:

答案 0 :(得分:14)

字典不保存存储的值。它管理的唯一事情是确保键到值的映射保持一致。您仍然需要使用适当的锁定来保护存储的对象的数据。

答案 1 :(得分:7)

ConcurrentDictionary使value对象线程的获取和添加安全。一旦获得value对象,多个线程访问或更改同一object的属性就不是线程安全的。