小编Aus*_*ris的帖子

添加到通用字典会导致IndexOutOfRangeException

我正在使用一些任务中的字典.

从逻辑上讲,我已经设置了它,以便我的密钥永远不会发生冲突,但有时当我添加到字典时,我会得到这个例外.

Index was outside the bounds of the array.
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
   at Rpc.<MapIntoRpc>b__4[T](Object x) in Rpc.cs:line 113
   at System.Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj)
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
Run Code Online (Sandbox Code Playgroud)

我知道尝试删除或多次添加相同的密钥可能会出现并发问题,但我已经在算法上考虑了这一点.

是什么导致添加有时会失败?解决这个问题的最佳方法是什么?

.net c# concurrency race-condition

29
推荐指数
3
解决办法
2万
查看次数

你能比较字符串的内存位置而不是内容吗?

我在某处读到,如果你的应用程序中有多个相同的字符串,那么实际上只创建了一个字符串,所有引用都指向同一个字符串.

在阅读有关锁时,我会看到有关此行为的警告.就像从不锁定字符串一样,因为应用程序中任何地方的任何其他锁都可能锁定在同一个字符串上 特别是如果你锁定:

string lockObj = "";
...
{
  lock(lockObj){
  ...
  }
}
Run Code Online (Sandbox Code Playgroud)

所以这让我回到那里只有一个特定字符串的单个副本.所以,如果我想比较两个字符串,有没有办法通过它们的内存位置来做到这一点?喜欢..

public bool areSame(string s1,string s2){
   return &s1 == &s2;
}
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

c# memory string clr pointers

3
推荐指数
1
解决办法
320
查看次数

锁定公共对象,并跨模块共享

我正在审查一些代码,并看到了我以前从未见过的东西.我找到了一个用于锁定的对象的所有引用,并得到了以下结果.

我已经替换了所有文件/类/成员名称以保护那些可能需要保护的人.

C:\Sln1\ProjX\ClassX.cs - (17, 26) : public static object PublicStaticLockObj = new object();
C:\Sln1\Proj1\Class1.cs - (193, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj1\Class1.cs - (228, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj1\Class1.cs - (92, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj2\Class2.cs - (115, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj2\Class2.cs - (181, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj2\Class2.cs - (216, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj3\Class3.cs - (160, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj3\Class3.cs - (195, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj3\Class3.cs - (95, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj4\Class4.cs - (133, …
Run Code Online (Sandbox Code Playgroud)

c# concurrency multithreading blocking

2
推荐指数
1
解决办法
983
查看次数