所以我有只同步操作的此方法:
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
属性表明它是成功的操作,并非所有这些条件条件都如此。
编辑:在评论中解决。仅仅因为方法以“异步”后缀表示,并不意味着它需要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;
}
正如其他人所指出的,类似任务的返回类型是异步签名,而是async
异步实现细节。完全有可能没有一个Task
-returning方法async
。
但是,有一个重要警告:例外。当异步(即,Task
类似返回)方法失败时,预期的语义是捕获异常并将其放在返回的任务上。
所以,你不想只回来CompletedTask
;您还希望捕获异常并使用Task.FromException
:
public Task FooAsync()
{
try
{
//do something synchronously
if(x == 0)
return Task.CompletedTask;
else if(x < 5):
//do something
return Task.CompletedTask;
// do something extra
return Task.CompletedTask;
}
catch (Exception ex)
{
return Task.FromException(ex);
}
}
在这一点上,有一些样板。你可能更愿意使用async
没有 await
,因为这样的:
#pragma warning disable 1998
public async Task FooAsync()
#pragma warning restore 1998
{
//do something synchronously
if(x == 0)
return;
else if(x < 5):
//do something
return;
// do something extra
}
这种方法的问题在于,除非包含丑陋的编译指示来禁用它们,否则您将得到编译器警告。如果您发现自己需要在多个地方执行此操作,则建议使用一些辅助方法(从AsyncEx库中窃取):
public static class TaskHelper
{
#pragma warning disable 1998
public static async Task ExecuteAsTask(Action func)
#pragma warning restore 1998
{
func();
}
#pragma warning disable 1998
public static async Task<T> ExecuteAsTask<T>(Func<T> func)
#pragma warning restore 1998
{
return func();
}
}
如此使用:
public Task FooAsync() => TaskHelper.ExecuteAsTask(() =>
{
//do something synchronously
if(x == 0)
return;
else if(x < 5):
//do something
return;
// do something extra
});
这使您可以快速轻松地包装同步方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句