Task.Run(M1Async)与M1Async()?

时间:2019-02-11 22:16:43

标签: c# asynchronous

我有一个异步方法M1Async。我需要在类的构造函数中调用它。首先,我只是调用async方法并使其运行

M1Async();

它可以按照我的预期运行并完成了工作-很好,它可以在后台运行并填充Winforms控件。但是,Visual Studio在调用下显示一条绿线,建议我在函数前面插入一个等待。

  

警告CS4014因为未等待此调用,所以在调用完成之前将继续执行当前方法。考虑将“ await”运算符应用于调用结果。

因此,我将调用async方法更改为无需等待

Task.Run(M1Async);

现在警告消失了。

它们实际上是一样的吗?由于后一种没有警告,因此调用它是更好的方法吗?

1 个答案:

答案 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;
}