我有这样的代码(这里简化),它等待着完成任务:如何结合TaskCompletionSource和CancellationTokenSource?
var task_completion_source = new TaskCompletionSource<bool>();
observable.Subscribe(b =>
{
if (b)
task_completion_source.SetResult(true);
});
await task_completion_source.Task;
的想法是认购和布尔值的流中等待true
。这完成了“任务”,我可以继续前进await
。
但是我想取消 - 但不是订阅,而是等待。我想通过取消令牌(不知何故)到task_completion_source
,所以当我取消令牌源时,await
将继续。
怎么办?
更新:CancellationTokenSource
是此代码的外部,我在这里所有的是从它的令牌。
'task_completion_source.SetCanceled'有什么问题?请注意,假设你正确地处理任务取消:) – Luaan
@Luaan,这没什么错,但没有代码**运行**可以执行它。每个人都在等待什么 - 订阅等待数据(可能没有),“等待”等待任务完成。 – astrowalker
如果通过canceltoken取消异步进程,它将触发一个TaskCanceledException,这反过来将结束等待(您需要处理异常)。 –