如何解决等待Task.CompletedTask与Return 界面实施#1 实施#2 实施#3
我试图了解await Task.CompletedTask
和return
之间的区别,但是似乎找不到任何明确定义的解释。
为什么/什么时候使用它:
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 举报,一经查实,本站将立刻删除。