相关疑难解决方法(0)

何时处置CancellationTokenSource?

这个班级CancellationTokenSource是一次性的.快速浏览Reflector证明KernelEvent了(很可能)非托管资源的使用.由于CancellationTokenSource没有终结器,如果我们不处理它,GC将不会这样做.

另一方面,如果您查看MSDN文章" 托管线程中的取消"中列出的示例,则只有一个代码段处置该令牌.

在代码中处理它的正确方法是什么?

  1. using如果您不等待它,则无法将启动并行任务的代码包装起来.只有在你不等的时候取消才有意义.
  2. 当然你可以ContinueWith通过Dispose电话添加任务,但这是要走的路吗?
  3. 那些可以取消同步的可取消的PLINQ查询呢,但最后只做一些事情?我们说吧.ForAll(x => Console.Write(x))
  4. 它可以重复使用吗?是否可以将相同的令牌用于多个调用,然后将其与主机组件一起处理,让我们说UI控件?

因为它没有类似于Reset清理IsCancelRequestedToken字段的方法,所以我认为它不可重复使用,因此每次启动任务(或PLINQ查询)时都应该创建一个新任务.这是真的吗?如果是,我的问题是Dispose在这些CancellationTokenSource案例中处理的正确和建议的策略是什么?

c# parallel-extensions plinq task-parallel-library c#-4.0

142
推荐指数
7
解决办法
4万
查看次数

我应该如何使用 DataflowBlockOptions.CancellationToken?

我该如何使用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)

c# tpl-dataflow

6
推荐指数
1
解决办法
1893
查看次数