相关疑难解决方法(0)

当Task有未处理的异常时,为什么我的进程不会终止?

我正在使用.NET 4.0构建Windows服务.

我在任务中抛出了各种未处理的异常,但它们不会像MSDN文档所述那样终止我的进程(并行任务 - 请参阅未观察到的任务异常).

"如果您没有给故障任务提供传播其异常的机会(例如,通过调用Wait方法),那么当任务被垃圾收集时,运行时将根据当前的.NET异常策略升级任务的未观察异常. ".

即使我使用最简单的任务调用,它的行为也是如此:

Task.Factory.StartNew(() => { throw new Exception(); } 
Run Code Online (Sandbox Code Playgroud)

调用该服务时,该服务保持正常运行.

根据文档,任务的终结器将在任务为GC后重新抛出异常,但这似乎不会发生.MSDN反复声明,正常的".NET异常策略"会导致进程终止.

为什么不终止我的应用程序?我能想到的唯一一件事就是以某种方式提到某个地方的任务(是lambda ??)

.net .net-4.0 task-parallel-library

15
推荐指数
3
解决办法
4902
查看次数

.NET 4.5中未观察到的任务异常仍会导致应用程序崩溃

Steven Toub的文章中:

为了使开发人员更容易编写基于Tasks的异步代码,.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

因为我传递一个无效的URL DownloadAsync()方法,调用HttpClientGetStringAsync()方法会抛出一个expcetion,并且它的应用程序崩溃.

所以我的问题是:默认情况下,.NET 4.5中未观察到的异常是否仍然会崩溃应用程序?

.net c#

12
推荐指数
1
解决办法
3723
查看次数

标签 统计

.net ×2

.net-4.0 ×1

c# ×1

task-parallel-library ×1