【发布时间】:2016-10-06 13:19:30
【问题描述】:
我有这样的代码(在这里简化)等待完成任务:
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,没有错,但是没有代码 running 可以执行它。每个人都在等待某事——订阅等待数据(可能没有),
await等待任务完成。 -
如果您通过取消令牌取消异步进程,它将触发 TaskCanceledException 进而结束等待(您需要处理异常)。
-
@SteveBird,“取消异步进程”是什么意思——在 CancellationTokenSource 设置取消?如果是,它是函数的外部方。如果您的意思是处理取消的令牌 - 这正是我的问题。首先,我看不出如何使用令牌。
标签: c# asynchronous async-await cancellationtokensource taskcompletionsource