为了使开发人员更容易编写基于任务的异步代码,.NET 4.5 更改了未观察到的异常的默认异常行为。虽然未观察到的异常仍会导致引发 UnobservedTaskException 事件(不这样做将是一项重大更改),但默认情况下进程不会崩溃。相反,无论事件处理程序是否观察到异常,异常最终都会在事件引发后被吃掉。
但我的实验结果与上述说法不符。下面是我的代码:
static void Main(string[] args)
{
DownloadAsync("http://an.invalid.url.com);
}
async static void DownloadAsync(string url)
{
using (var client = new System.Net.Http.HttpClient())
{
string text = await client.GetStringAsync(url);
Console.WriteLine("Downloaded {0} chars", text.Length);
}
}
由于我将无效的 url 传递给方法,因此对的DownloadAsync()
方法的调用将引发异常,并导致应用程序崩溃。HttpClient
GetStringAsync()
所以我的问题是:默认情况下,.NET 4.5 中未观察到的异常是否仍然会使应用程序崩溃?