我正在尝试创建一个异步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操作呢?
谢谢:)
m_collection.Count == 0
):ct.Register(() => tcs.TrySetResult(default(T)));
这个TrySetResult被正确调用了,但是取消的任务似乎没有被正确关闭 :( - Nisalon