我们在 .Net 4(没有可用的异步等待)应用程序中使用任务,有时它们用于启动“Fire and Forget”操作,如下所示:
private void Test()
{
Task task = Task.Factory.StartNew(() =>
{
throw new ApplicationException("Test");
});
}
我们希望此异常在不等待任务的情况下使应用程序崩溃(否则将其放在任务中是没有意义的,至少在我们的场景中)并且不等待终结器,因为我们希望在发生意外错误时关闭应用程序避免状态损坏(我们正在保存异常发生时存在的状态)。
我的猜测是,我们应该以某种方式处理延续任务,但这会将延续代码放入另一个不会使应用程序崩溃的任务中,所以我被阻止在这里。
任何帮助将不胜感激
Edit:如果切换到线程池,结果就是预期的结果。以下代码使应用程序崩溃:
ThreadPool.QueueUserWorkItem((c) =>
{
throw new ApplicationException("Test");
});
我终于找到了如何做到这一点,即使它有点复杂:
namespace ThreadExceptions
{
using System;
using System.Threading;
using System.Threading.Tasks;
public static class TaskExtensions
{
public static Task ObserveExceptions(this Task task)
{
return task.ContinueWith((t) =>
{
ThreadPool.QueueUserWorkItem((w) =>
{
if (t.Exception != null)
{
foreach (Exception ex in t.Exception.InnerExceptions)
{
throw new TaskException(ex);
}
}
});
}, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.PreferFairness);
}
}
}
这将使应用程序在没有等待任务的情况下崩溃。这就是我一直在寻找的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)