我正在尝试创建一个异步 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 ?
谢谢 :)