首页 新闻 会员 周边

C# Task 返回值

0
悬赏园豆:200 [待解决问题]

我有如下方法

private async Task TaskReturnMethod()
{
    var user = await repository.GetUser();

    if (user == null)
    {
        await Task.CompletedTask;
        return;
    }
    
    // do something...
}

当我对 user 进行核对时,如果值为 NULL,结束流程。
我现在的做法是先让任务完成,然后直接使用 return; 结束方法,这样做似乎感觉有什么不妥。
我这边一直遵循错误提前判断的原则,麻烦各位不要针对判断规则去回答。

Mops的主页 Mops | 初学一级 | 园豆:23
提问于:2019-11-21 10:01

你是要返回值吗 ?
private async Task<int> TaskReturnMethod()
{
var user = await repository.GetUser();

if (user == null)
{
    //await Task.CompletedTask;
   return await Task.FromResult(0)

}

// do something...

}

Misterj 3年前
< >
分享
所有回答(6)
0

await Task.CompletedTask; 多余的。可以直接return;

czd890 | 园豆:14412 (专家六级) | 2019-11-21 10:17

为什么?直接让任务完成,在方法执行完后,它会更快的被放回线程池,而不是等 CLR 去处理?

支持(0) 反对(0) Mops | 园豆:23 (初学一级) | 2019-11-21 10:21

@Mops:
await Task.CompletedTask; 这句话在这里没有任何意义。
下面的代码逻辑挺好的。

private async Task TaskReturnMethod()
{
    var user = await repository.GetUser();

    if (user == null)
    {
        return;
    }
    
    // do something...
}
支持(0) 反对(0) czd890 | 园豆:14412 (专家六级) | 2019-11-21 16:23
0

public async Task MethodName()
{
      await Task.CompletedTask;
}

不要return也可以

小小高 | 园豆:1095 (小虾三级) | 2019-11-21 10:22

如果不 return 返回,直接使用 await Task.CompletedTask ,那么后续的逻辑依旧会执行,在提问的代码中就会引发空指针异常?这样是不规范的编写规范吧!

支持(0) 反对(0) Mops | 园豆:23 (初学一级) | 2019-11-21 10:32

@Mops: 请问一下,您现在的写法不妥之处具体指?

支持(0) 反对(0) 小小高 | 园豆:1095 (小虾三级) | 2019-11-21 10:39

@小小高: 先完成任务,然后再使用 return 返回,这样线程切换到主线程(上下文延续)会不会有什么影响。虽然可以使用 ConfigureAwait(false) 避免上下文延续,但是这样会不会影响线程回收到线程池。

支持(0) 反对(0) Mops | 园豆:23 (初学一级) | 2019-11-21 10:47
0

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;
}

先检查再处理是对的。我认为你之前不妥的地方是要明确返回一个值给调用方。

努力吧兄Dei | 园豆:140 (初学一级) | 2019-11-21 10:41

该场景不需要返回值。

支持(0) 反对(0) Mops | 园豆:23 (初学一级) | 2019-11-21 10:54
0

可以用 ValueTask

private async ValueTask TaskReturnMethod()
{
    var user = await repository.GetUser();

    if (user == null)
    {
        return;
    }

    // do something...
}
dudu | 园豆:30994 (高人七级) | 2019-11-21 17:07
0

if (user == null)
{
throw new exception(“XX”);
}

如何

放逐人 | 园豆:694 (小虾三级) | 2019-11-26 18:04
0

不知道题主想问什么。
上面代码除了 await Task.CompletedTask; 这句没有任何意义(等待“一个已经完成的任务”完成任务) ,其他都OK

sweetjian | 园豆:276 (菜鸟二级) | 2020-01-17 15:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册