如何将异常从任务/线程传播到在 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 异步等待任务。