假设我有一个带有Main方法的控制台应用程序,如下所示:
public static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += (sender, eventArgs) =>
{
Console.WriteLine("App Unobserved");
};
TaskScheduler.UnobservedTaskException += (sender, eventArgs) =>
{
Console.WriteLine("Task Unobserved");
};
Task.Run(async () => await MyAwesomeMethod());
// other awesome code...
Console.ReadLine();
}
public static async Task MyAwesomeMethod()
{
// some useful work
if (something_went_wrong)
throw new Exception();
// other some useful work
}
所以,我只是运行MyAwesomeMethod(即发即忘),并想做其他工作,但我也想知道是否有任何未处理的异常。但是应用程序成功完成而没有任何问题迹象(异常只是被吞下)。
如何处理来自MyAwesomeMethod()的异常,无需等待它或使用Task.Run(...)。Wait()?
答案 0 :(得分:2)
那不是“火与忘记”。 “火与忘记”字面意思是你不关心任务完成时(或是否)(或错误)。所以,我只是运行MyAwesomeMethod(即发即忘)...但我也想知道是否有任何未处理的异常。但是应用程序成功完成而没有任何问题迹象(异常只是被吞下)。
如何在不等待它或使用Task.Run(...)的情况下处理来自MyAwesomeMethod()的异常.Wait()?
无论如何使用await
:
Task.Run(async () => {
try {
await MyAwesomeMethod();
} catch (Exception ex) {
Console.WriteLine(ex);
}
});
答案 1 :(得分:1)
完成任务后,您可以查看status任务。
Task.Run(() => MyAwesomeMethod()).ContinueWith((task) =>
{
if (task.Status == TaskStatus.RanToCompletion && task.Result != null)
{
}
else
{
try
{
Logger.LogError(task.Exception.ToString());
Logger.LogMessage("something_went_wrong");
}
catch { }
}
});
答案 2 :(得分:0)
例如,你可以在try ... catch块中将代码包装在后台任务中,并在进入catch块后立即引发事件(如果你这样做)。
像
event EventHandler<Exception> exceptionInWorker;
并在任务中
try
{
//do something
}
catch (Exception e)
{
exceptionInWorker?.Invoke(this, e);
}
答案 3 :(得分:-2)
您可以像订购TaskScheduler.UnobservedTaskException事件一样订阅,但是使用UnobservedTaskExceptionEventArgs作为其第二个参数的处理程序,通过它可以通过其Exception属性访问未处理的异常并记录有关它的所有信息。