我有一个简单的程序:
class Program
{
static void Main(string[] args)
{
Run().Wait();
}
private static async Task Run()
{
string someVariable = null;
someVariable.Replace(",", ".");
}
}
Run()方法被故意设计为引发NullReferenceException。令我困扰的是为什么在网上抛出异常
Run.Wait()
代替
someVariable.Replace(",",".");
InnerException中提供了实际的异常-为什么?我丢失了调试上下文,因为在Run方法之外引发了异常。
如果我的程序是同步的:
class Program
{
static void Main(string[] args)
{
Run();
}
private static void Run()
{
string someVariable = null;
someVariable.Replace(",", ".");
}
}
异常被抛出在正确的行上。为什么异步会打破这个?
答案 0 :(得分:5)
调用Run.Wait()时,Run()方法引发了空异常,然后Wait方法将引发AggregateException。顺便说一句,您不会失去上下文。如果单击[查看详细信息]并查看当前异常的 InnerException 的 StackTrace ,则可以发现该异常来自 Run()方法:
答案 1 :(得分:3)
@Nhan Phan所说的是真的。
还有另一种方法可以解决此问题:
除了使用.Wait()
以外,您还可以使用.GetAwaiter.GetResult()
来解开AggregateException。
如果您使用的是C#7.1,则可以使用async void Main
和await
的{{1}}方法