首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >适当使用BlockingCollection

适当使用BlockingCollection
EN

Stack Overflow用户
提问于 2012-09-26 20:42:17
回答 2查看 1.6K关注 0票数 1

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

谢谢

代码语言:javascript
复制
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();
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-26 20:54:17

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

代码语言:javascript
复制
  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();
  }
票数 2
EN

Stack Overflow用户

发布于 2012-09-26 20:56:59

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12601966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档