C# 何时可以阻止收集<;T>;TryTake()返回false?

C# 何时可以阻止收集<;T>;TryTake()返回false?,c#,collections,concurrency,C#,Collections,Concurrency,假设BlockingCollection在下面使用ConcurrentQueue,如果使用Timeout.Infinite,它什么时候可以返回false?下面是一个简单的示例,说明它什么时候可以返回false:当集合标记为CompletedAdding并变为空时 //by default, BlockingCollection will use ConcurrentQueue BlockingCollection<int> coll = new BlockingCollection&

假设BlockingCollection在下面使用ConcurrentQueue,如果使用Timeout.Infinite,它什么时候可以返回false?

下面是一个简单的示例,说明它什么时候可以返回false:当集合标记为
CompletedAdding
并变为空时

//by default, BlockingCollection will use ConcurrentQueue
BlockingCollection<int> coll = new BlockingCollection<int>();

coll.Add(1);
coll.Add(2);
coll.CompleteAdding();

int item;

if (coll.TryTake(out item, -1))
{
    Console.WriteLine(item);
}

if (coll.TryTake(out item, -1))
{
    Console.WriteLine(item);
}

if (coll.TryTake(out item, -1))
{
    //this won't get hit
}
else
{
    Console.WriteLine("TryTake returned false!");
}
//默认情况下,BlockingCollection将使用ConcurrentQueue
BlockingCollection coll=新建BlockingCollection();
coll.Add(1);
coll.Add(2);
coll.completedadding();
国际项目;
如果(列在第-1项之外)
{
控制台写入线(项目);
}
如果(列在第-1项之外)
{
控制台写入线(项目);
}
如果(列在第-1项之外)
{
//这不会被击中的
}
其他的
{
WriteLine(“TryTake返回false!”);
}

这允许您禁止在队列中添加新项目并完成剩余元素的处理

这将打印
false

 var coll = new BlockingCollection<int>();            

 coll.CompleteAdding();   // closed for business

 int v;
 bool result = coll.TryTake(out v, Timeout.Infinite);

 Console.WriteLine(result);
var coll=new BlockingCollection();
coll.CompleteAdding();//停业
INTV;
bool result=coll.TryTake(out v,Timeout.Infinite);
控制台写入线(结果);

因此,BlockingCollection基本上支持两个独立的概念:空和闭。虽然TryTake()可以在空队列上永远等待,但当队列为空且已关闭时,它将返回
false

您链接到的文档包含问题的答案。你在回答什么?一个具体的例子?会失败的代码?文档清楚地说明了导致方法抛出的原因。或者,您是在询问它何时会返回
false
,而不是抛出异常?@ledbutter这就是我要问的,我已经更新了OP.@elgonzo,所以在这种情况下,除非msdn链接中列出了异常,否则它不会返回false?如果不使用.completedadding()触发,它不会返回false,对吗?如果不使用.completedadding()触发,它不会返回false,对吗?@Gyrien correct,但它永远不会通过最后一个
TryTake
调用(假设您使用无限超时),因为它将在那里等待,直到您发出向集合添加内容的信号。