我有这样的取消令牌
static CancellationTokenSource TokenSource= new CancellationTokenSource();
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的阻止集合
BlockingCollection<object> items= new BlockingCollection<object>();
var item = items.Take(TokenSource.Token);
if(TokenSource.CancelPending)
return;
Run Code Online (Sandbox Code Playgroud)
我打电话的时候
TokenSource.Cancel();
Run Code Online (Sandbox Code Playgroud)
Take不会像它应该的那样继续下去.如果我使用带轮询的TryTake,令牌显示它被设置为已取消.
我在Albahari的一本Nutshell书中重用了C#中的示例生产者消费者队列(http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT),一位同事评论道:"为什么不调用Dispose关于收集处理中的BlockingCollection?"
我找不到答案,我能想出的唯一理由是不会处理队列剩余工作量的执行.但是,当我处理队列时,为什么不停止处理呢?
除了"为什么你不应该处理BlockingCollection?" 我还有第二个问题"如果你不处理BlockingCollection,会不会受到伤害?".我想当你产生/处理大量的生产者消费者队列时,它会产生问题(不是我想要的,而只是为了知道的原因).
根据BlockingCollection.Dispose实际做了什么?BlockingCollection包含两个等待句柄(显然),所以不调用Dispose会给你一些问题.谢谢ken2k指出这一点.
我正在谈论的代码:
public class PCQueue : IDisposable
{
BlockingCollection<Action> _taskQ = new BlockingCollection<Action>();
public PCQueue (int workerCount)
{
// Create and start a separate Task for each consumer:
for (int i = 0; i < workerCount; i++)
Task.Factory.StartNew (Consume);
}
public void Dispose() { _taskQ.CompleteAdding(); }
public void EnqueueTask (Action action) { _taskQ.Add (action); }
void Consume()
{
// This sequence that we’re enumerating will block when no elements
// are available …Run Code Online (Sandbox Code Playgroud)