5

我正在使用并发字典的 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();
        }
    }
}
4

2 回答 2

15

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

于 2014-04-29T20:32:01.020 回答
8

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

于 2014-04-29T20:33:20.163 回答