c# – 为什么Task.Factory.StartNew()没有为await抛出编译器警告?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 为什么Task.Factory.StartNew()没有为await抛出编译器警告?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1302字,纯文字阅读大概需要2分钟。
内容图文
![c# – 为什么Task.Factory.StartNew()没有为await抛出编译器警告?](/upload/InfoBanner/zyjiaocheng/808/80c6362a382a43f99887b4dc567538d5.jpg)
在visual studio 2012和(我假设)之外,对未等待的异步功能的调用会产生警告,即
public static async Task FunctionAsync()
{
await Task.Delay(10);
}
public static void SyncCaller()
{
FunctionAsync();
}
SyncCaller唯一的代码行将显示编译器警告:“由于不等待此调用,因此当前方法在调用完成之前继续运行.”
但是,如果我重写SyncCaller():
public static void SyncCaller()
{
Task.Factory.StartNew(() => { });
}
没有这样的警告,但是从StartNew的文档中可以清楚地看出它返回了一个等待的任务.那么,我错过了什么?为什么StartNew没有警告我可能的错误?
此外,如果有人能够对我的问题发表意见并指出我关于await运算符如何在幕后工作的讨论的方向,我将非常感激.语法似乎被设计为隐藏LOT,因为我可以编写一个返回Tasks的方法,当方法体在任何时候都不会创建任何这样的东西.
编辑:
其他人似乎认为你无法等待StartNew返回的内容.举个例子:
public static async void SyncCaller()
{
await Task.Factory.StartNew(() => { });
}
该方法正确等待StartNew返回的Task的完成,所以我不认为StartNew是新异步模型的例外.
解决方法:
如果您使方法异步,那么您将获得所需的警告,此代码会发出警告:
public static async void SyncCaller()
{
Task.Factory.StartNew(() => { });
}
由于无法在非异步方法中等待,因此编译器不会警告您等待,因为您无法等待而不使您的方法异步.所以编译器不能建议您使用非法的东西.
当然,这可能会导致警告试图避免的相同的意外行为.编译器可以说首先使你的方法异步然后等待这个调用,但那将是太多的建议.
内容总结
以上是互联网集市为您收集整理的c# – 为什么Task.Factory.StartNew()没有为await抛出编译器警告?全部内容,希望文章能够帮你解决c# – 为什么Task.Factory.StartNew()没有为await抛出编译器警告?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。