1

我即将使用像下面这样的 BlockingCollection,只是想检查它是否适合线程安全等。想知道我是否需要 CancellationTokenSource 来处理任何事情。

谢谢

public class MyApp
{
  private BlockingCollection<int> blockingCollection;

  public void Start()
  {
     blockingCollection= new BlockingCollection<int>();
     var task = Task.Factory.StartNew(ProcessData);
  }

  public void Add(int value)
  {
    blockingCollection.Add(value); //This is a thread that receives input
  }

  private void ProcessData()
  {
    foreach(var item in blockingCollection.GetConsumingEnumerable())
    {  
      ...
    }
  }

  public void Finish()
  {
    blockingCollection.CompleteAdding();
  }
}
4

2 回答 2

2

显然,您可以在代码中使用取消令牌来支持优雅的取消模式:

  private readonly CancellationTokenSource cts = new CancellationTokenSource();

  public void Start()
  {
     blockingCollection= new BlockingCollection<int>();
     var task = Task.Factory.StartNew(ProcessData, cts.Token);
  }

  private void ProcessData()
  {
    foreach(var item in blockingCollection.GetConsumingEnumerable(cts.Token))
    {  
        cts.Token.ThrowIfCancellationRequested();

        // ...
    }
  }

  public void Cancel()
  {
      cts.Cancel();
  }
于 2012-09-26T12:54:16.513 回答
2

是的,BlockingCollection它本身是线程安全的。来自 MSDN:

IProducerConsumerCollection 表示允许线程安全地添加和删除数据的集合。BlockingCollection 用作 IProducerConsumerCollection 实例的包装器,允许从集合中删除尝试阻塞,直到可以删除数据。

好的,这并没有说明使用它的实际代码,但从我在您的代码中看到的情况来看,它使用正确。

于 2012-09-26T12:56:59.023 回答