在c#中将void转换为async return

本文关键字:async return 转换 void 中将 | 更新日期: 2023-09-27 18:10:38

我读到从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,因为我的代码根本不需要返回任何东西,我应该返回什么?

在c#中将void转换为async return

如果我把它改为返回Task,因为我的代码不需要返回任何at我该还什么呢?

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

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

请注意,当你在MainFunctionAsync中等待这两个操作时,你不是触发和忘记,你是异步等待它们中的每一个完成,顺序的。

public async Task MainFunctionAsync()
{
    await DoSomethingAsync();
    await DoSomethingMoreAsync();
}
public Task DoSomethingAsync() 
{
    // Do meaningful async stuff
}
public Task DoSomethingMoreAsync()
{
    // Do more meaningful async stuff
}

你可以返回其中一个

Task.FromCompleted;
Task.FromException(ex);

所以你的方法应该是这样的:

public void MainFunction()
{
    await DoSomething()
    await DoSomethingMore()
}
public Task DoSomething() 
{
    try{
     //some code that I want to execute (fire and forget)
     return Task.FromCompleted;
   }
   catch(Exception ex){
     return Task.FromException(ex);
   }
}

    //some code that I want to execute (fire and forget)
}
public Task DoSomethingMore()
{
       try{
     //some code that I want to execute (fire and forget)
     return Task.FromCompleted;
   }
   catch(Exception ex){
     return Task.FromException(ex);
   }
}