【发布时间】:2013-03-07 00:09:07
【问题描述】:
一些伪代码来说明我的问题:
public async Task DoSomethingAsync()
{
try
{
var task1 = DoThisAsync(); // throws exception
var task2 = DoThatAsync();
await task1.Then(t => Handle(t));
await task2.Then(t => Handle(t));
}
catch (AggregateException)
{
Console.WriteLine("Whatnow?");
}
}
And Then 是这样定义的:
// from https://gist.github.com/rizal-almashoor/2818038
public static Task Then(this Task task, Action<Task> next)
{
var tcs = new TaskCompletionSource<AsyncVoid>();
task.ContinueWith(t=>
{
if (t.IsFaulted)
tcs.TrySetException(t.Exception); // continuing task1 this line only gets hit
// after DoThatAsync() is completed??
else
{
try
{
next(t);
tcs.TrySetResult(default(AsyncVoid));
}
catch (Exception ex)
{
tcs.TrySetException(ex);
}
}
});
return tcs.Task;
}
所以我的问题是,由于某种原因,即使 DoThisAsync() 很早就抛出了异常,但在 DoThatAsync() 完成之前我看不到“whatnow”。 这不是确切的代码,我试图简化以免浪费您的时间。如果这里没有任何内容可以解释这种行为,请告诉我,我会添加更多细节。
编辑
出于这个问题的目的,我们可以想象 DoThisAsync() 和 DoThatAsync() 是异步方法,基本上执行以下操作:
DoThisAsync:
Thread.Sleep(30000); // wait a short perioud of time
throw new Exception(); // and throw an exception
DoThatAsnyc:
Thread.Sleep(240000); // wait a long period of time
【问题讨论】:
-
你能添加一个完整的例子吗,因为在我做的一个小例子中,这不是发生的事情,
DoThatAsync没有被调用... -
所以我编辑了我的问题,现在它看起来更像真正的代码。此外,确保 DoThisAsync() 在异常发生之前有足够长的时间(睡眠),例如一两分钟,以便有时间启动 DoThatAsync()
-
这仍然不是一个完整的例子。请举例说明你在 DoThis/ThatAsync() 中所做的事情
-
不确定你的意思,DoThisAsync() does 抛出一个我 do 捕获的异常,我唯一的问题是为什么我没有捕获它在 DoThatAsync() 完成之前?
-
您的示例
DoThatAsync是完全同步的。您的实际代码是同步的还是异步的? (完全同步的方法会同步运行,即使它被标记为async)。
标签: c# asynchronous task-parallel-library