C# 在C中将void转换为异步返回#
我读到,从C#C# 在C中将void转换为异步返回#,c#,async-await,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() { /
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
?如果我把它改为returntask,因为我的代码根本不需要返回任何东西,我应该返回什么
如果我将其更改为returntask,因为我的代码在
好吧,我该还什么
您当前的代码不会编译,因为您不能对void
返回方法执行wait
(因为它不返回waitable,而waitable是一种公开GetAwaiter
方法的类型)
同步世界中的任何void
方法在异步世界中都应该返回一个Task
。这允许任何希望异步等待异步操作的人,也有机会正确处理异常。使用async void
意味着异常将被吞没,或者如果在配置中设置为,则将在任意线程池线程上重新释放。异步应该一直正确传播
请注意,当您在mainfunctionsync
中等待这两个操作时,您并没有触发和忘记,而是异步地等待它们中的每一个按顺序完成
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);
}
}
你不能
wait
这些方法-它们没有被标记为异步的。Main
不能async
@shay_uuuuuu,不-你不能wait
这些方法,因为它们不返回任务(或者更确切地说,是一个可等待的)async与之无关。@shay_uuuuuuuuuuuu。不在我的编译器中。这只是意味着您不必显式返回任务,但方法签名仍然必须将任务
(或另一个可等待的)作为返回类型。@shay\uuu您永远不能等待一个方法,而是等待一个可等待的值。通常是一项任务<代码>无效不是值,不可等待async
对调用方没有任何影响。Task.FromException包含得很好,就像.Net 4.8中的注释一样,您应该使用Task.CompletedTask