10

我有以下两种方法

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

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

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

4

2 回答 2

12

它不需要 - 如果您在第二种方法中使用 await/async,那么在这种情况下,您将添加额外的开销,而这无济于事。

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

归根结底,async实际上await只是语言功能,可以轻松创建和编写Task. 如果您已经有一个完美Task的返回,则无需使用额外的语言支持将其解包并重新包装成一个新的Task.

于 2013-03-16T01:01:00.277 回答
12

为了补充 Reed 的好答案,请这样想:

Func<int, int> GetFunc()
{
    Func<int, int> f = GetFunc(someParameter);

你应该说

    return f;

或原因“我应该在这里返回一个 func,所以让我们制作一个调用我手头的 func 的 lambda”:

    return (int i) => f(i);

我希望你会做前者;你已经有一个Func<int, int>在手,所以把它归还。不要创建一个调用函数的函数。

如果你有

IEnumerable<int> GetSequence()
{
    IEnumerable<int> sequence = GetSequence(someParameter);

你可以说

    return sequence;

或者

    foreach(int item in sequence) yield return item;

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

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

于 2013-03-16T15:35:24.673 回答