【发布时间】:2021-04-12 14:29:25
【问题描述】:
所以我有这个只有同步操作的方法:
public void Foo(){
//do something synchronously
if(x == 0)
return;
else if(x < 5):
//do something
return;
// do something extra
}
由于一些接口更改,该方法必须更改为异步,尽管没有异步操作。为了拥有 async 关键字,它的主体中必须有一个 await 关键字。原始同步方法的等效方法是:
public async Task FooAsync(){
//do something synchronously
if(x == 0)
await Task.CompletedTask;
else if(x < 5):
//do something
await Task.CompletedTask;
// do something extra
}
我不确定这一点,因为 CompletedTask 属性表明它是成功的操作,但并非所有这些条件都是如此。
编辑:在 cmets 中解决。仅仅因为一个方法用“异步”后缀表示,并不意味着它需要一个async 修饰符。该函数将编写如下所示以遵守界面更改:
public Task FooAsync(){
//do something synchronously
if(x == 0)
return Task.CompletedTask;
else if(x < 5):
//do something
return Task.CompletedTask;
// do something extra
return Task.CompletedTask;
}
【问题讨论】:
-
仅仅因为接口要求它返回一个任务并不意味着它必须被标记为异步。您可以不将其标记为异步,将返回类型设为 Task,然后将其设为
return Task.CompletedTask。 -
只需
return Task.CompletedTask就可以了。忘记async和await -
No....仅仅因为接口声明了带有 -Async 后缀的方法名称并不意味着它必须被标记为异步。在不需要时将其标记为异步只会引入不必要的状态机。
-
@avhhh 接口只会表明它返回一个
Task。仅当您必须使用await时才需要async关键字,并且仅当您的某些代码应在异步调用后运行时才需要await,而您的代码并非如此。 -
您可能会觉得这很有趣:Eliding Async and Await。如果发生异常,删除 async/await 会改变方法的行为。
标签: c# async-await