【发布时间】:2015-06-27 04:39:12
【问题描述】:
我如何使用DataflowBlockOptions.CancellationToken?
如果我像这样创建BufferBlock 的实例:
var queue = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 5, CancellationToken = _cts.Token });
那么有使用queue 的消费者/生产者方法,我如何使用它的 CancellationToken 来处理取消?
例如在生产者方法中,我如何检查取消令牌 - 我没有找到任何可以访问令牌的属性..
编辑: 生产/消费方法示例:
private static async Task Produce(BufferBlock<int> queue, IEnumerable<int> values)
{
foreach (var value in values)
{
await queue.SendAsync(value);
}
queue.Complete();
}
private static async Task<IEnumerable<int>> Consume(BufferBlock<int> queue)
{
var ret = new List<int>();
while (await queue.OutputAvailableAsync())
{
ret.Add(await queue.ReceiveAsync());
}
return ret;
}
调用它的代码:
var queue = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 5, CancellationToken = _cts.Token });
// Start the producer and consumer.
var values = Enumerable.Range(0, 10);
Produce(queue, values);
var consumer = Consume(queue);
// Wait for everything to complete.
await Task.WhenAll(consumer, queue.Completion);
EDIT2:
如果我调用_cts.Cancel(),Produce 方法不会取消并且不会中断地结束。
【问题讨论】:
-
how I can use是什么意思?如果你想取消操作,你可以在_cts对象上调用.Cancel(假设它是一个CancellationTokenSource。当然你可以随时检查是否有一个取消请求IsCancellationRequested -
我可以将取消令牌传递给
BufferBlock构造函数(通过DataflowBlockOptions)。然后,如果我将这个BufferBlock的实例传递给某个库的produce 方法,该方法就无法从BufferBlock访问令牌。那么这个有什么用呢? -
你能举一个完整的例子吗?在这种情况下,您最终也可以将令牌提供给您要创建的任务see here for an introduction
-
@CarstenKönig 看到我编辑的问题。我对如何使用
DataflowBlockOptions.CancellationToken中传递的令牌或将其传递给BufferBlock的构造函数的目的特别感兴趣
标签: c# tpl-dataflow