У меня есть такой код (упрощенный здесь), который ожидает отделочные задачи:Как объединить 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, это ничего плохого, но нет кода ** running **, который мог бы его выполнить. Все ждут чего-то - подписка ждет данных (может быть, нет), 'await' ждет завершения задачи. – astrowalker
Если вы отмените процесс async через cancelationtoken, он вызовет исключение TaskCanceledException, которое, в свою очередь, закончит ожидание (вам нужно обработать исключение). –