c# - 在 C# 中将 void 转换为异步返回

标签 c# async-await

我读到从 C# async 调用返回 void 不好。但我有以下情况:

public async void MainFunction()
{
    await DoSomething()
    await DoSomethingMore()
}

public void DoSomething() 
{
    //some code that I want to execute (fire and forget)
}

public void DoSomethingMore()
{
    //some code that I want to execute (fire and forget)
}

因为我只想执行该函数而根本不返回。我应该保持这样,还是应该从 DoSomething() 返回 Task?如果我把它改为返回 Task,因为我的代码根本不需要返回任何东西,我应该返回什么?

最佳答案

If i change it to return Task, since my code need return nothing at all, what should i return?

您当前的代码无法编译,因为您不能在 void 返回方法上 await(因为它不返回可等待的类型它公开了一个 GetAwaiter 方法)。

同步世界中的任何void 方法都应该在异步世界中返回一个Task。这允许任何希望异步等待异步操作的人,也有机会正确处理异常。使用 async void 意味着异常将被吞噬,或者如果在配置中设置为,将在任意线程池线程上重新抛出。异步应该一直正确传播。

请注意,当您在 MainFunctionAsync 中等待这两个操作时,您并不是先发后遗,而是异步等待每个操作按顺序完成。

public async Task MainFunctionAsync()
{
    await DoSomethingAsync();
    await DoSomethingMoreAsync();
}

public Task DoSomethingAsync() 
{
    // Do meaningful async stuff
}

public Task DoSomethingMoreAsync()
{
    // Do more meaningful async stuff
}

关于c# - 在 C# 中将 void 转换为异步返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332164/

相关文章:

c# - 以编程方式使用 POST 发送表单

c# - 如何使 EF 核心将自定义排序转换为纯 'When Then' 而不是分层

c# - 使用 LINQ Min() 获取对象?

c# - 在 C# 中使用 Datagrid 更新数据库

c# - WPF ListBoxItem IsMouseOver

Android 服务中的 Kotlin 协程

c# - 将异步等待集成到同步方法中

c# - 设置超时时 HttpClient 挂起 (Windows Phone)

asynchronous - 在 Typescript 中使用 async/await 时未定义 __awaiter

python - 异步属性 setter