Некоторое время ломая голову над своим кодом, я обнаружил, что исключения обязательно не распространяются через ContinueWith:
Код: Выделить всё
int zeroOrOne = 1;
Task.Factory.StartNew(() => 3 / zeroOrOne)
.ContinueWith(t => t.Result * 2)
.ContinueWith(t => Console.WriteLine(t.Result))
.ContinueWith(_ => SetBusy(false))
.LogExceptions();
Итак... Я написал себе небольшой метод расширения (с множеством различных перегрузок, но в основном все так делают):
Код: Выделить всё
public static Task ContinueWithEx(this Task task, Action continuation)
{
return task.ContinueWith(t =>
{
if(t.IsFaulted) throw t.Exception;
continuation(t);
});
}
Код: Выделить всё
public static Task ContinueWithEx(this Task task, Action continuation)
{
var tcs = new TaskCompletionSource();
task.ContinueWith(t =>
{
if(t.IsFaulted) tcs.TrySetException(t.Exception);
continuation(t);
tcs.TrySetResult(default(object));
});
return tcs.Task;
}
Являются ли эти две версии строго эквивалентными? Или есть тонкая разница между throw t.Exception и tcs.TrySetException(t.Exception)?
Кроме того, тот факт, что, по-видимому, есть только один другой человек во всем Интернете, который это сделал, указывает, что мне не хватает идиоматического способа сделать это?
Подробнее здесь: https://stackoverflow.com/questions/118 ... ntinuewith
Мобильная версия