Я выполняю стандартную операцию копирования результата Task
в TaskCompletionSource
:
TaskCompletionSource<int> tcs = ...;
Task<int> task = ...;
task.ContinueWith(t =>
{
if (t.IsCanceled)
tcs.TrySetCanceled(new TaskCanceledException(task).CancellationToken);
else if (t.IsFaulted)
tcs.TrySetException(task.Exception.InnerExceptions);
else
tcs.TrySetResult(task.Result);
});
Вы можете заметить забавный фрагмент кода для установки токена, который вызывает отмену. Это часть, которую я пытаюсь сделать немного чище.
В качестве детали реализации существует элемент Task.CancellationToken
, к которому было бы здорово иметь доступ, но он является внутренним. Создание нового TaskCanceledException
- это самый дешевый способ получить к нему доступ. Есть ли лучший способ?