- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个异步 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/
我是一名优秀的程序员,十分优秀!