我怎么能使用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:
解决方法
如果你想取消生产过程,你应该在其中传递令牌,如下所示:
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] 举报,一经查实,本站将立刻删除。