在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,因为我的代码根本不需要返回任何东西,我应该返回什么?
如果我把它改为返回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);
}
}