应该获取Task并将其传递的方法等待它吗?

haz*_*zik 9 c# async-await c#-5.0

我有以下两种方法

public async Task<bool> DoSomething(CancellationToken.token) 
{
    //do something async
}

//overload with None token 
public /*async*/ Task<bool> DoSomething()
{
    return /*await*/ DoSomething(CancellationToken.None);
}
Run Code Online (Sandbox Code Playgroud)

是否应该使用async/await关键字标记第二种方法?

Ree*_*sey 12

它不需要 - 如果你在第二种方法中使用await/async,你将增加额外的开销,在这种情况下什么也不做.

内部的异步工作DoSomething(CancellationToken)已经为您提供了适当的异步处理和封送回现有的上下文.

在一天结束的时候,asyncawait真的只是语言特性,它可以很容易地创建和撰写Task.如果您已经非常好Task地返回,则无需使用额外的语言支持来解包并将其重新打包为新的Task.

  • @labroo在这种情况下,我可能会使用"Task.FromResult". (2认同)

Eri*_*ert 11

要添加到Reed的好答案,请以这种方式思考:

Func<int, int> GetFunc()
{
    Func<int, int> f = GetFunc(someParameter);
Run Code Online (Sandbox Code Playgroud)

你应该说吗?

    return f;
Run Code Online (Sandbox Code Playgroud)

或者说"我应该在这里返回一个函数,所以让我们创建一个调用我手中的函数的lambda":

    return (int i) => f(i);
Run Code Online (Sandbox Code Playgroud)

我希望你能做到前者; 你已经拥有了Func<int, int>,所以回来吧.不要创建一个调用func的函数.

如果你有

IEnumerable<int> GetSequence()
{
    IEnumerable<int> sequence = GetSequence(someParameter);
Run Code Online (Sandbox Code Playgroud)

你可以说

    return sequence;
Run Code Online (Sandbox Code Playgroud)

要么

    foreach(int item in sequence) yield return item;
Run Code Online (Sandbox Code Playgroud)

?我再次希望你能做到前者.你手头有一个序列,那么为什么要制作一个枚举旧序列的新序列呢?

任务也是如此; 就像你可以创建一个包装另一个委托的委托和一个包装另一个序列的序列一样,你可以创建一个包装另一个任务的任务,但为什么呢?这只是浪费资源.

  • @Brian:很有意思.后一种情况可以说不是一个错误,因为它有影响; 首先,它确保结果序列与源序列没有引用标识,其次,它确保第二个序列*只读*即使源序列不是. (3认同)