1

我正在运行一些使用 ConcurrentBags 的代码。我正在探索 IEnumerable 功能。我运行的代码是

ConcurrentBag<int> bag = new ConcurrentBag<int>();

Task.Run(() =>
{
    bag.Add(42);
    Thread.Sleep(1000);
    bag.Add(21);
});
Task.Run(() =>
{
    foreach (int i in bag)
        Console.WriteLine(i);

}).Wait();

我希望代码返回 42,但它什么也没返回。我的假设错了吗?

4

1 回答 1

4

基本上,你有一个竞争条件。在我的机器上,大部分时间都会打印 42 - 但基本上你有两个独立的任务:一个添加,一个打印。无法保证哪个任务将首先执行其第一条语句,因为您在两个任务之间没有同步或协调。

如果您想在开始迭代包之前确保第一次Add调用已经完成,您需要进行一些协调。

于 2013-10-09T13:49:49.530 回答