我有如下方法
private async Task TaskReturnMethod()
{
var user = await repository.GetUser();
if (user == null)
{
await Task.CompletedTask;
return;
}
// do something...
}
当我对 user
进行核对时,如果值为 NULL
,结束流程。
我现在的做法是先让任务完成,然后直接使用 return;
结束方法,这样做似乎感觉有什么不妥。
我这边一直遵循错误提前判断的原则,麻烦各位不要针对判断规则去回答。
await Task.CompletedTask; 多余的。可以直接return;
为什么?直接让任务完成,在方法执行完后,它会更快的被放回线程池,而不是等 CLR 去处理?
@Mops:
await Task.CompletedTask; 这句话在这里没有任何意义。
下面的代码逻辑挺好的。
private async Task TaskReturnMethod()
{
var user = await repository.GetUser();
if (user == null)
{
return;
}
// do something...
}
public async Task MethodName()
{
await Task.CompletedTask;
}
不要return也可以
如果不 return
返回,直接使用 await Task.CompletedTask
,那么后续的逻辑依旧会执行,在提问的代码中就会引发空指针异常?这样是不规范的编写规范吧!
@Mops: 请问一下,您现在的写法不妥之处具体指?
@小小高: 先完成任务,然后再使用 return
返回,这样线程切换到主线程(上下文延续)会不会有什么影响。虽然可以使用 ConfigureAwait(false)
避免上下文延续,但是这样会不会影响线程回收到线程池。
private async Task<bool> TaskReturnMethod()
{
bool rtnRs = false;
var user = await repository.GetUser();
if (user == null)
{
//await Task.CompletedTask;//获取一个已成功完成的任务。此处不需要。
return rtnRs;
}
// do something...
rtnRs = true;
return rtnRs;
}
先检查再处理是对的。我认为你之前不妥的地方是要明确返回一个值给调用方。
该场景不需要返回值。
可以用 ValueTask
private async ValueTask TaskReturnMethod()
{
var user = await repository.GetUser();
if (user == null)
{
return;
}
// do something...
}
if (user == null)
{
throw new exception(“XX”);
}
如何
不知道题主想问什么。
上面代码除了 await Task.CompletedTask; 这句没有任何意义(等待“一个已经完成的任务”完成任务) ,其他都OK
你是要返回值吗 ?
private async Task<int> TaskReturnMethod()
{
var user = await repository.GetUser();
}
}
– Misterj 4年前