这个班级CancellationTokenSource是一次性的.快速浏览Reflector证明KernelEvent了(很可能)非托管资源的使用.由于CancellationTokenSource没有终结器,如果我们不处理它,GC将不会这样做.
另一方面,如果您查看MSDN文章" 托管线程中的取消"中列出的示例,则只有一个代码段处置该令牌.
在代码中处理它的正确方法是什么?
using如果您不等待它,则无法将启动并行任务的代码包装起来.只有在你不等的时候取消才有意义.ContinueWith通过Dispose电话添加任务,但这是要走的路吗?.ForAll(x => Console.Write(x))?因为它没有类似于Reset清理IsCancelRequested和Token字段的方法,所以我认为它不可重复使用,因此每次启动任务(或PLINQ查询)时都应该创建一个新任务.这是真的吗?如果是,我的问题是Dispose在这些CancellationTokenSource案例中处理的正确和建议的策略是什么?
我该如何使用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;
}
Run Code Online (Sandbox Code Playgroud)
调用它的代码:
var queue = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = …Run Code Online (Sandbox Code Playgroud)