使用异步 void 方法运行长寿命操作

本文关键字:操作 运行 方法 异步 void | 更新日期: 2023-09-27 18:30:34

使用async void方法启动一些长寿命的操作是否合适?我知道Nito或Task.Run()可用于从非异步方法运行任务。有什么区别?有什么陷阱吗?

我的意思是,我可以这样写吗:

async void bar()
{
    try
    {
        //...
    }
    catch (Exception ex)
    {
        // no rethrowing here
    }
}
void foo()
{
    bar();
    // will continue right after 1st await in bar()
    baz();
}

使用异步 void 方法运行长寿命操作

在任何情况下,最好使用 async Task 来获得更好的错误处理行为。您无需等待结果任务。

在代码片段中,注释will continue right after 1st await in bar不一定正确。就目前而言bar将同步执行并阻止foo bar因为其中没有等待。

启动长时间运行的操作需要使用异步 IO 或以某种方式使用新线程/任务(Task.Run是合适的)。