5

コンカレント ディクショナリの GetOrAdd メソッドを使用して値のリストを取得し、その値のリストを参照して編集しています。このようにするのはスレッドセーフですか?

最初の方法で値を追加し、2 番目の方法でリストをクリアします。

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 に答える