我将使用下面这样的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();
}
}发布于 2012-09-26 20:54:17
显然,您可以在代码中使用取消令牌来支持优雅的取消模式:
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-26 20:56:59
是的,BlockingCollection本身是线程安全的。来自MSDN:
IProducerConsumerCollection表示允许以线程安全的方式添加和删除数据的集合。BlockingCollection用作IProducerConsumerCollection实例的包装器,允许从集合中的移除尝试阻塞,直到有数据可移除为止。
好吧,这并没有说明使用它的实际代码,但从我在您的代码中看到的情况来看,它是正确使用的。
https://stackoverflow.com/questions/12601966
复制相似问题