gpt4 book ai didi

c# - 当任务抛出异常而不等待终结器时如何使应用程序崩溃

转载 作者:太空狗 更新时间:2023-10-29 21:22:12 25 4
gpt4 key购买 nike

我们在 .Net 4(没有可用的异步等待)应用程序中使用任务,有时它们用于启动“即发即弃”操作,如下所示:

private void Test()
{
Task task = Task.Factory.StartNew(() =>
{
throw new ApplicationException("Test");
});
}

我们希望这个异常在不等待任务的情况下使应用程序崩溃(否则将它放在任务中是没有意义的,至少在我们的场景中)并且不等待终结器,因为我们想在意外时关闭应用程序发生错误以避免状态损坏(我们正在保存异常发生时存在的状态)。

我的猜测是,我们应该以某种方式处理延续任务,但这会将延续代码放入另一个不会导致应用程序崩溃的任务中,所以我在这里被阻止了。

任何帮助将不胜感激

编辑:如果切换到 ThreadPool,则结果是预期的。以下代码使应用程序崩溃:

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);
}
}
}

这会使应用程序在没有等待任务的情况下崩溃。这正是我要找的。

关于c# - 当任务抛出异常而不等待终结器时如何使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27856784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com