相关疑难解决方法(0)

.NET - 字典锁定与ConcurrentDictionary

我找不到关于ConcurrentDictionary类型的足够信息,所以我想我会在这里问一下.

目前,我使用a Dictionary来保存由多个线程(来自线程池,因此没有确切数量的线程)不断访问的所有用户,并且它具有同步访问权限.

我最近发现在.NET 4.0中有一组线程安全的集合,它似乎非常令人愉快.我想知道,什么是"更有效和更容易管理"的选项,因为我可以选择正常Dictionary的同步访问,或者具有ConcurrentDictionary已经线程安全的选项.

参考.NET 4.0 ConcurrentDictionary

.net concurrency dictionary concurrentdictionary

121
推荐指数
6
解决办法
6万
查看次数

在ConcurrentDictionary AddOrUpdate中为更新部分添加的内容

我试图使用Dictionary重新编写一些代码来使用ConcurrentDictionary.我已经回顾了一些示例,但我仍然无法实现AddOrUpdate函数.这是原始代码:

    dynamic a = HttpContext;
    Dictionary<int, string> userDic = this.HttpContext.Application["UserSessionList"] as Dictionary<int, String>;

   if (userDic != null)
   {
      if (useDic.ContainsKey(authUser.UserId))
      {
        userDic.Remove(authUser.UserId);
      }
   }
  else
  {
     userDic = new Dictionary<int,string>();
  }
  userDic.Add(authUser.UserId, a.Session.SessionID.ToString());
  this.HttpContext.Application["UserDic"] = userDic;
Run Code Online (Sandbox Code Playgroud)

我不知道要为更新部分添加什么:

userDic.AddOrUpdate(authUser.UserId,
                    a.Session.SessionID.ToString(),
                    /*** what to add here? ***/);
Run Code Online (Sandbox Code Playgroud)

任何指针将不胜感激.

c# concurrent-collections

103
推荐指数
3
解决办法
8万
查看次数

虽然更新并发字典中的值最好锁定字典或值

我正在对从 TryGet 获得的值执行两次更新,我想知道哪个更好?

选项 1:只锁定价值?

if (HubMemory.AppUsers.TryGetValue(ConID, out OnlineInfo onlineinfo))
{
    lock (onlineinfo)
    {
        onlineinfo.SessionRequestId = 0;
        onlineinfo.AudioSessionRequestId = 0;
        onlineinfo.VideoSessionRequestId = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

选项 2:锁定整个字典?

if (HubMemory.AppUsers.TryGetValue(ConID, out OnlineInfo onlineinfo))
{
    lock (HubMemory.AppUsers)
    {
        onlineinfo.SessionRequestId = 0;
        onlineinfo.AudioSessionRequestId = 0;
        onlineinfo.VideoSessionRequestId = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# concurrentdictionary signalr

6
推荐指数
2
解决办法
248
查看次数