【发布时间】:2012-10-26 09:08:45
【问题描述】:
如果我们有一个装满 100 个对象的 ConcurrentBag<object>safeBag`。
然后一个线程作为:
foreach(object o in safeBag)
{
Thread.Sleep(1000);
}
另一个线程在第一个线程启动后立即启动:
{
safeBag.AddOrTake(something);
}
第二个线程会等待 100 秒进入资源吗? 另一个问题,如果第一个线程使用 Parallel.ForEach() 运行,线程将如何工作?
编辑:MSDN 说:“列表可以同时支持多个读取器,只要不修改集合。通过集合枚举本质上不是线程安全的过程。在极少数情况下,枚举与一个或更多写访问,确保线程安全的唯一方法是在整个枚举期间锁定集合。”通过 ConcurrentBag 进行枚举是否会导致第二个线程等待对 ConcurrentBag 的写入访问?
【问题讨论】:
-
第一个问题:您是否尝试使用少量 Console.WriteLine() 运行测试程序?
-
第二个问题:这取决于您在 Parallel.ForEach 中执行的操作。再次,抱歉坚持,先尝试再问你不懂的地方(附上完整的运行示例)
标签: c# .net concurrency foreach