微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

等待Task.CompletedTask与Return 界面实施#1 实施#2 实施#3

如何解决等待Task.CompletedTask与Return 界面实施#1 实施#2 实施#3

我试图了解await Task.CompletedTaskreturn间的区别,但是似乎找不到任何明确定义的解释。

为什么/什么时候使用它:

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

在此吗?

public async Task test()
{
    return;
}

我的理解是,虽然我都认为status可能与TaskStatus.RanToCompletion设置为await Task.CompletedTask,但根据Task.FromResult的解释,这可能与物理时间或类似时间有关:

通常在无需执行较长代码路径即可立即知道任务的返回值时使用该方法

在我已经在GitHub上研究了MS代码,MS Docs以及我能找到的每个链接的情况下,我会很清楚地对此进行神秘化解释,但是没有地方给出清晰的解释。我还看到较大方法的结尾处​​的Task.Fromresult,根据我从MS on GitHub发现的一些评论,实际上是错误的,因为它不应该包含该注释,并且他们希望将其从存储库中清除。 / p>

如果public async Task<bool> test() { return await Task.Fromresult(true); } 的明确神秘化(由于它们是兄弟姐妹)也将受到赞赏,因为我还不清楚何时使用:

public async Task<bool> test()
{
    return true;
}

对此:

Input:
N = 3 //total number of nodes in the list
value[] = {1,3,4}
C = 2 //position of the last connected node,if it is zero it is not connected
Output: 1

解决方法

让我们从消费者的角度来看问题。

如果您定义了一个接口,该接口强加了一个返回Task的操作,那么您实际上并没有说明它将如何计算/执行(因此,没有async访问修饰符在方法签名中)。这是实施细节

界面

public interface ITest
{
    Task Test();
    Task<bool> IsTest();
}

因此,如何实现该接口取决于您。

当由于缺少AsyncStateMachine关键字而不会产生任何async时,您可以以同步方式进行操作。

实施#1

public class TestImpl : ITest
{
    public Task Test()
    {
        return Task.CompletedTask;
    }

    public Task<bool> IsTest()
    {
        return Task.FromResult(true);
    }
}

或者您可以尝试以异步方式实现它,但是没有await运算符。在这里您将收到CS1998警告。

实施#2

public class TestImpl : ITest
{
    public async Task Test()
    {
        return;
    }

    public async Task<bool> IsTest()
    {
        return true;
    }
}

此异步方法缺少“等待”运算符,将同步运行。考虑使用“ await”运算符来等待非阻塞API调用,或者使用“ await Task.Run(...)”来在后台线程上执行CPU绑定的工作。

换句话说,此实现未定义状态机。异步方法根据await关键字分为不同的状态:

  • before_the_await_1,
  • after_the_await_1_but_before_the_await_2
  • after_the_await_2_but_before_the_await_3
  • ...

如果您没有任何等待,那么您将拥有一个可以同步运行的状态(无需保留状态,无需执行异步操作,然后调用MoveNext())。


或者您可以尝试使用await运算符以异步方式实现它。

实施#3

public class TestImpl : ITest
{
    public async Task Test()
    {
        await Task.CompletedTask;
    }

    public async Task<bool> IsTest()
    {
        return await Task.FromResult(true);
    }
}

在这种情况下,将有一个异步状态机,但不会在堆上分配它。默认情况下,它是一个struct,如果它同步完成,那么我们就不需要在堆上分配它们来延长其寿命,而不会超出该方法的范围。

有关更多信息,请阅读以下文章:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。