收集被修改; 枚举操作可能无法执行.锁在哪里可用?

Mon*_*RPG 6 c# collections multithreading locking thread-safety

这是一个只有我正在编写和使用的小程序.

现在我要编写所有使用导致此问题的hashset的区域的代码

我不明白这是怎么可能的.此项目仅在MainWindow中使用

hsProxyList是一个哈希集

  HashSet<string> hsProxyList = new HashSet<string>();
Run Code Online (Sandbox Code Playgroud)

错误发生在下面的迭代中

 lock (hsProxyList)
            {
    int irRandomProxyNumber = GenerateRandomValue.GenerateRandomValueMin(hsProxyList.Count, 0);
    int irLocalCounter = 0;
    foreach (var vrProxy in hsProxyList)
    {
       if (irLocalCounter == irRandomProxyNumber)
       {
       srSelectedProxy = vrProxy;
       break;
       }
         irLocalCounter++;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用hsProxyList的其他地方

我在计算时没有锁定对象 - 我想这不会导致任何错误但可能不正确 - 不重要

 lblProxyCount.Content = "remaining proxy count: " + hsProxyList.Count;
Run Code Online (Sandbox Code Playgroud)

lock (hsProxyList)
{
    hsProxyList.Remove(srSelectedProxy);
}
Run Code Online (Sandbox Code Playgroud)

lock (hsProxyList)
{
    hsProxyList = new HashSet<string>();
    foreach (var vrLine in File.ReadLines(cmbBoxSelectProxy.SelectedItem.ToString()))
    {
        hsProxyList.Add(vrLine);
    }
}
Run Code Online (Sandbox Code Playgroud)

可以看出我到处都在使用锁.这是一个多线程软件.所有hsProxyList都在MainWindow.xaml.cs中使用 - 它是一个C#WPF应用程序

Sto*_*lly 9

问题出在你所拥有的地方

lock (hsProxyList)
{
    hsProxyList = new HashSet<string>();
    // etc
}
Run Code Online (Sandbox Code Playgroud)

所有锁都在特定对象上,但是当您这样做时,您正在更改hsProxyList = new HashSet<string>();对象,而变量hsProxyList引用的对象不再被锁定.