gpt4 book ai didi

c# - 如何从 TaskCompletionSource 取消任务?

转载 作者:行者123 更新时间:2023-11-30 14:12:23 25 4
gpt4 key购买 nike

我正在尝试创建一个异步 ProducerConsumerCollection,为此,我正在使用此 msdn 页面(http://msdn.microsoft.com/en-us/library/hh873173.aspx(页面底部))。

我现在正在尝试添加超时,这是我所做的:

    public async Task<T> TakeWithTimeout(int timeout)
{
Task<T> takeTask = this.Take();

if (timeout <= 0 || takeTask == await Task.WhenAny(this.tasks.Take(), Task.Delay(timeout)))
{
return await takeTask;
}
else
{
// Timeout
return default(T);
}
}
}

此代码的问题在于,在超时的情况下,它不会取消由 Take() 方法创建的任务。

既然这个任务是由 TaskCompletionSource“创建”的,我不能给它一个 cancellationToken 吗?

那么,如何继续取消它并正确实现这个 Take with timeout 呢?

谢谢:)

最佳答案

编写取消安全 async - 友好的生产者/消费者收集非常重要。你需要做的是改变Take接受CancellationToken作为参数,它应该注册一个处理程序,以便在取消时 TaskCompletionSource已取消。

我强烈建议您使用 BufferBlock<T> ,它内置了取消支持。

如果您不能使用 TPL 数据流(例如,您在 PCL 中工作或数据流不支持目标平台),那么您可以使用我的开源 AsyncEx library 中的生产者/消费者集合。 (例如 AsyncProducerConsumerQueue AsyncCollection )。这些都是基于 AsyncLock AsyncConditionVariable ,我简要描述的设计 on my blog (这不涉及取消细节)。使用此设计支持生产者/消费者集合中的取消背后的关键是支持 AsyncConditionVariable.WaitAsync 中的取消;一旦您的条件变量类型支持取消,那么您的集合也将轻松支持它。

关于c# - 如何从 TaskCompletionSource 取消任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17819629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com