我有一个异步方法M1Async
。我需要在类的构造函数中调用它。首先,我只是调用async方法并使其运行
M1Async();
它可以按照我的预期运行并完成了工作-很好,它可以在后台运行并填充Winforms控件。但是,Visual Studio在调用下显示一条绿线,建议我在函数前面插入一个等待。
警告CS4014因为未等待此调用,所以在调用完成之前将继续执行当前方法。考虑将“ await”运算符应用于调用结果。
因此,我将调用async方法更改为无需等待
Task.Run(M1Async);
现在警告消失了。
它们实际上是一样的吗?由于后一种没有警告,因此调用它是更好的方法吗?
答案 0 :(得分:0)
当您使用不带await关键字的异步方法时,基本上是一劳永逸。这意味着您不会对返回的对象甚至操作的结果(无论是成功还是失败)都感到迷惑。
如果您打算在另一种方法中使用此任务的输出,则不能保证任务操作已完成/将要完成并且该值可供使用。
如果查看Task.Run
的签名,您会看到它返回任务。由此可以得出结论,如果不等待Task.Run
,它将与以前一样 Fire and Forget
在您的构造函数中您可以
private readonly Task _task;
MyConstructor()
{
_task = M1Async();
}
public async Task MyMethod()
{
//if the result of the async method is important
await _task;
}