在Silverlight 5中使用async时,堆栈跟踪不提供异常源方法

时间:2014-10-08 02:42:33

标签: c# .net async-await silverlight-5.0 stack-trace

我在VS2013中创建了一个新的Silverlight 5项目,并添加了Microsoft Async(1.0.168)NuGet包。然后我创建一个简单的异步事件处理程序,如下所示:

private async void OnButtonClick(object sender, RoutedEventArgs e)
{
    await AsyncMethod();
}

private static async Task AsyncMethod()
{
    await TaskEx.Run(() => { });
    NormalMethod();
}

private static void NormalMethod()
{
    throw new Exception("test exception");
}

当我点击按钮时,我得到以下异常:

{System.Exception: test exception
at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)
at Microsoft.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Microsoft.Runtime.CompilerServices.TaskAwaiter.GetResult()
at SilverlightApplication1.MainPage.<OnButtonClick>d__0.MoveNext()}

此处缺少的我想要用于调试目的的关键信息是异常的源方法(即NormalMethod)。

我已经回顾了一些相关的问题(下面链接)并且认为我理解async对堆栈跟踪的影响,但我不明白为什么框架不会以保持知识的方式抛出异常源方法。关于如何简单地获取此信息的任何想法/建议?

相关问题:
Missing exception stack trace informations when using Async Targeting Pack in Silverlight 5.0
Is it possible to get a good stack trace with .NET async methods?

1 个答案:

答案 0 :(得分:1)

试试我的这个要点:

https://gist.github.com/aelij/7d37fa3657921cbd9d3d

  

上述代码与官方Microsoft.Bcl.Async实现之间的区别在于方法PrepareExceptionForRethrow。 Silverlight没有ExceptionDispatchInfo,因此原始实现重新抛出异常,从而丢失原始堆栈跟踪信息。此代码尝试通过搜索合适的构造函数将异常包装为相同类型的内部异常。