【发布时间】:2014-10-07 22:35:22
【问题描述】:
在 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 运算符如何在幕后工作的讨论的方向,我将非常感激。该语法似乎旨在隐藏很多内容,因为我可以编写一个返回 Tasks 的方法,而该方法体在任何时候都不会创建任何这样的东西。
编辑: 其他人似乎认为您不能等待 StartNew 返回的内容。举个例子:
public static async void SyncCaller()
{
await Task.Factory.StartNew(() => { });
}
该方法正确等待 StartNew 返回的 Task 的完成,所以我不认为 StartNew 是新异步模型的例外。
【问题讨论】:
-
您在
void方法中,不希望返回某些内容。这与调用返回bool的单个方法没有什么不同。编译器没有理由发出警告/错误。 -
@TyCobb,FunctionAsync 和 Task.Factory.StartNew 都将 Task 作为返回类型,而不是 void。唯一返回类型为 void 的函数是 SyncCaller,它在调用 FunctionAsync 时会收到警告,就像我在示例中所做的那样。
标签: c# .net asynchronous