C# 如何在没有竞争条件和异常的情况下检测BlockingCollection的AddingCompleted?

C# 如何在没有竞争条件和异常的情况下检测BlockingCollection的AddingCompleted?,c#,multithreading,race-condition,blockingcollection,C#,Multithreading,Race Condition,Blockingcollection,我使用的是一个只从一个线程填充,只由一个线程使用的。生产和消费物品效果良好。问题出在这个操作的末尾。任务块(如预期)位于getconsumineGenumerable。调用completedadding后,任务将处理BlockingCollection,并将毫无例外地完成。到目前为止还不错 现在我有了一个线程,它将项目添加到BlockingCollection。此线程必须测试IsAddingCompleted,然后必须添加该项。但是在为IsAddingCompleted和添加项目之间存在竞争条件

我使用的是一个只从一个线程填充,只由一个线程使用的。生产和消费物品效果良好。问题出在这个操作的末尾。任务块(如预期)位于
getconsumineGenumerable
。调用
completedadding
后,任务将处理
BlockingCollection
,并将毫无例外地完成。到目前为止还不错

现在我有了一个线程,它将项目添加到
BlockingCollection
。此线程必须测试
IsAddingCompleted
,然后必须添加该项。但是在为
IsAddingCompleted
和添加项目之间存在竞争条件。有一个-method,但是如果添加已经完成,它也会引发异常

如何在没有附加锁的情况下添加用于添加已完成的项或测试?为什么
TryAdd
抛出任何异常?如果添加已完成,则返回
false
即可

非常简化的代码如下所示:

private BlockingCollection<string> _items = new BlockingCollection<string>();

public void Start()
{
    Task.Factory.StartNew(
        () =>
            {
                foreach (var item in this._items.GetConsumingEnumerable())
                {
                }

                this._items.Dispose();
            });

    Thread.Sleep(50); // Wait for Task

    this._items.CompleteAdding(); // Complete adding
}

public void ConsumeItem(string item)
{
    if (!this._items.IsAddingCompleted)
    {
        this._items.Add(item);
    }
}
private BlockingCollection\u items=new BlockingCollection();
公开作废开始()
{
Task.Factory.StartNew(
() =>
{
foreach(此.u items.GetConsumingEnumerable()中的变量项)
{
}
此._items.Dispose();
});
Thread.Sleep(50);//等待任务
此._items.CompleteAdding();//完成添加
}
公共项(字符串项)
{
如果(!this.\u items.IsAddingCompleted)
{
此项。添加(项);
}
}
是的,我知道这段代码没有意义,因为几乎没有机会添加任何项,而foreach循环什么都不做。消耗性任务对我的问题无关紧要

问题显示在
ConsumeItem
-方法中。我能够在
ConsumeItem
周围添加一个额外的锁(信号量)并
完成添加
+
Dispose
,但我试图避免这种性能影响

如何添加没有任何例外的项目?如果添加已完成,则丢失项目将被罚款