2014-10-08 54 views
2

我在VS2013中创建了一个新的Silverlight 5项目并添加了Microsoft Async(1.0.168)NuGet包。然后我创建了一个简单的异步事件处理程序如下:在Silverlight 5中使用异步时,堆栈跟踪不提供异常源方法

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)。

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

相关问题:
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

试试这个要点矿:

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

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

+0

感谢您的回复@Eli。回复较晚,抱歉。我放弃了在我正在开发的项目中使用异步。我只是在我的问题中概述的简单场景中尝试了你的要点,现在确实在异常详细信息中提供了源方法的详细信息。尽管如此,我还没有做过任何进一步的测试。 – Chris 2015-10-23 00:01:30

相关问题