微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 我应该如何使用DataflowBlockOptions.CancellationToken?

我怎么能使用DataflowBlockOptions.CancellationToken?

如果我像这样创建BufferBlock的实例:

var queue = new BufferBlock< int>(new DataflowBlockOptions {BoundedCapacity = 5,CancellationToken = _cts.Token});

然后使用使用队列的消费者/生产者方法,我如何使用其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方法不会取消并完成而不会中断.

解决方法

如果你想取消生产过程,你应该在其中传递令牌,如下所示:

private static async Task Produce(
        BufferBlock<int> queue,IEnumerable<int> values,CancellationToken token
        )
    {
        foreach (var value in values)
        {
            await queue.SendAsync(value,token);
            Console.WriteLine(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;
    }

    static void Main(string[] args)
    {
        var cts = new CancellationTokenSource();

        var queue = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 5,CancellationToken = cts.Token });

        // Start the producer and consumer.
        var values = Enumerable.Range(0,100);
        Produce(queue,values,cts.Token);
        var consumer = Consume(queue);

        cts.Cancel();

        try
        {
            Task.WaitAll(consumer,queue.Completion);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

        foreach (var i in consumer.Result)
        {
            Console.WriteLine(i);
        }

        Console.ReadKey();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐