c# - 集合被修改;枚举操作可能无法执行。到处都在用锁怎么可能?

标签 c# multithreading collections thread-safety locking

这是一个只有我自己编写和使用的小程序。

现在我将编写所有使用导致此问题的哈希集的区域的代码

我不明白这怎么可能。此项仅在 MainWindow 中使用

hsProxyList 是一个哈希集

  HashSet<string> hsProxyList = new HashSet<string>();

错误发生在下面的迭代中

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

我使用hsProxyList的其他地方

当我得到它的计数时我没有锁定对象 - 我想这不会导致任何错误但可能不正确 - 不是致命的重要

 lblProxyCount.Content = "remaining proxy count: " + hsProxyList.Count;

lock (hsProxyList)
{
    hsProxyList.Remove(srSelectedProxy);
}

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

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

最佳答案

问题出在你身上

lock (hsProxyList)
{
    hsProxyList = new HashSet<string>();
    // etc
}

所有锁都在一个特定的对象上,但是当你这样做时你正在改变对象 hsProxyList = new HashSet<string>();因此变量 hsProxyList 所指的对象不再被锁定。

关于c# - 集合被修改;枚举操作可能无法执行。到处都在用锁怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16759964/

相关文章:

java - 解锁锁定同步块(synchronized block)的可靠方法

multithreading - Rust 标准库中的线程局部变量是如何工作的?

objective-c - 在删除某个对象之前,我应该检查它是否存在于集合中吗?

javascript - 无论如何,可以将 $.inArray (或替代方案)与 JavaScript 对象数组一起使用吗?

c# - 如何使用 MigraDoc 添加书签?

c# - 如何在asp.net web api中使用caSTLe Windsor在身份验证过滤器属性中实现依赖注入(inject)?

c# - 服务耗尽 TCP 连接

c# - 使用静态变量的并发

java - 在单线程环境中使用Hashtable等线程安全集合类有什么缺点吗?

java - 访问 Executor Service Future 列表时出现 ConcurrentModificationException