如何将异常从任务/线程传播到在 C# 中创建此任务的方法?
How to propagate an Exception from a Task / Thread to the method that created this Task in c#?
我不知道如何正确地将异常从任务传播到创建此任务的线程:
private void threadMT()
{
Task task;
try
{
task = new Task(() =>
{
throw new Exception("blabla");
});
task.Start();
while(!task.IsCompleted)
Thread.Sleep(500);
if (task.IsFaulted)
throw task.Exception;
}
catch (Exception ex)
{
throw ex;
}
}
当到达这一行时:
throw new Exception("blabla");
应用程序停止说异常未处理。
它可以传播回方法吗?
提前致谢。
从在线程池上执行的 Task
传播异常的最简单方法是将其实际转换为 return 一个 Task
,您可以 await
在:
public async Task AwaitOnTaskAsync()
{
try
{
await DoStuffWithThreadAsync();
}
catch (Exception e)
{
}
}
public Task DoStuffWithThreadAsync()
{
return Task.Run(() => { throw new Exception("blabla"); });
}
await
将确保从 Task
中解包异常,允许您对其应用 try-catch
。
旁注 - 不要使用 Task
构造函数,而是使用 Task.Run
到 return 一个 "hot task" (已经启动的构造函数)。创建一个 Task
是没有意义的,你稍后会主动阻止使用 Thread.Sleep
,要么同步执行它,要么使用 async-await 异步等待任务。
我不知道如何正确地将异常从任务传播到创建此任务的线程:
private void threadMT()
{
Task task;
try
{
task = new Task(() =>
{
throw new Exception("blabla");
});
task.Start();
while(!task.IsCompleted)
Thread.Sleep(500);
if (task.IsFaulted)
throw task.Exception;
}
catch (Exception ex)
{
throw ex;
}
}
当到达这一行时:
throw new Exception("blabla");
应用程序停止说异常未处理。 它可以传播回方法吗?
提前致谢。
从在线程池上执行的 Task
传播异常的最简单方法是将其实际转换为 return 一个 Task
,您可以 await
在:
public async Task AwaitOnTaskAsync()
{
try
{
await DoStuffWithThreadAsync();
}
catch (Exception e)
{
}
}
public Task DoStuffWithThreadAsync()
{
return Task.Run(() => { throw new Exception("blabla"); });
}
await
将确保从 Task
中解包异常,允许您对其应用 try-catch
。
旁注 - 不要使用 Task
构造函数,而是使用 Task.Run
到 return 一个 "hot task" (已经启动的构造函数)。创建一个 Task
是没有意义的,你稍后会主动阻止使用 Thread.Sleep
,要么同步执行它,要么使用 async-await 异步等待任务。