Chu*_*son 7 c# debugging visual-studio async-await
我正在努力弄清楚如何使用visual studio 理智地调试异步代码,因为它没有破坏我想要的地方。例如,在这段代码中:
using System;
using System.Threading.Tasks;
namespace TestNS{
class Program {
static void Main(string[] args) {
Foo().Wait(); // sadly, it breaks here
}
static async Task Foo() {
var foo = 42;
if (foo == 42) {
throw new Exception(); // want it to break here
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何让 Visual Studio 自动中断引发异常的位置而不是程序顶部?或者等效地,在不重新启动进程的情况下,我可以跳转到该上下文并查看那些本地人的值吗?
我理解根本问题是异常在技术上由幕后异步代码处理,因此 VS 不会将它们视为未处理的。当然没有其他人喜欢这种行为,并且有一种方法可以告诉 VS 没有真正捕获到异步调用的异常......抛出”等,断断续续,但没有任何帮助。
我不是在寻找包括编辑我的代码或手动添加断点的解决方案。同样,以特殊方式处理某些异常也不是真正的解决方案。并非我想打破的所有异常都来自我自己的代码;通常它来自字典中丢失的键或类似的东西。开发代码时总是会发生意外异常,我想轻松查看程序状态,而无需手动放置断点和/或 try/catch 代码,重新运行程序,手动推进程序直到我碰巧到达该功能。而且,这一切都是在我什至可以让它再次触发的假设下,当我一开始不知道它为什么会发生时。然后对开发过程中可能发生的每个异常执行此操作。
最重要的是,如果您正在查看AggregateException确实返回的那个,则甚至没有一个很好的方法来找出该异常的来源。您必须“查看详细信息”,然后展开异常,展开内部异常,将鼠标悬停在堆栈跟踪上,记住文件和行号,关闭详细信息,手动转到正确的位置,现在放置手动断点和去手动调试。为什么系统不能使用此堆栈跟踪来做正确的事情?
我把所有这些细节都放进去是因为我已经阅读了 20 篇关于类似主题的其他 SO 帖子。他们没有把所有这些细节都放进去,人们似乎很开心,所以我很困惑我做错了什么。在开发非异步代码时,这些都不会发生。我在上面做的所有步骤都是必要的吗?在检查异常上下文方面,使编写异步代码与编写非异步代码一样愉快的最佳实践是什么?