介绍
令人费解了我一会儿代码后,我发现异常不一定通过传播ContinueWith
:
int zeroOrOne = 1;
Task.Factory.StartNew(() => 3 / zeroOrOne)
.ContinueWith(t => t.Result * 2)
.ContinueWith(t => Console.WriteLine(t.Result))
.ContinueWith(_ => SetBusy(false))
.LogExceptions();
在这个例子中, SetBusy
线“复位”异常链,所以通过零异常的鸿沟是没有看到,随后在我的脸炸毁“任务的异常(S),未观察到......”
所以...我写我自己有点扩展方法(以吨重载不同,但基本上都这样做):
public static Task ContinueWithEx(this Task task, Action<Task> continuation)
{
return task.ContinueWIth(t =>
{
if(t.IsFaulted) throw t.Exception;
continuation(t);
});
}
周围多一点搜索,我碰到这个博客帖子,在那里,他提出了一个类似的解决方案,但使用TaskCompletionSource,其中(转述)看起来是这样的:
public static Task ContinueWithEx(this Task task, Action<Task> continuation)
{
var tcs = new TaskCompletionSource<object>();
return 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)
此外,没有一个事实,即有显然只有一个其他人的整个互联网是谁在做这在表明我就是缺少这样做的惯用方法是什么?