代码之家  ›  专栏  ›  技术社区  ›  ca9163d9

任务运行(M1Async)与M1Async()?[重复]

  •  1
  • ca9163d9  · 技术社区  · 7 年前

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

    M1Async();
    

    它按照我的预期运行并完成了工作——可以在后台运行并填充Winforms控件。然而,VisualStudio在调用下面显示了一条绿线,并建议我在函数前面插入一个wait。

    警告CS4014由于未等待此调用,因此当前方法的执行将在调用完成之前继续。考虑将“等待”操作符应用到调用的结果。

    因此,我改变了调用异步方法的方法,而不用等待

    Task.Run(M1Async);
    

    现在警告消失了。

    它们实际上是一样的吗?既然后一个没有警告,这是更好的称呼方式吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Derviş Kayımbaşıoğlu    7 年前

    当您使用不带wait关键字的异步方法时,基本上是先发后忘。这意味着您不必担心返回的对象,甚至不必担心操作的结果(无论是成功还是失败)。

    如果您打算在另一个方法中使用此任务的输出,则不能保证任务操作已完成/将完成,并且该值可供使用。

    如果你看到 Task.Run 您将看到它返回任务。由此我们可以得出结论,如果 任务跑 没有等待它会像以前一样 开火然后忘记

    在构造函数中,您可以

    private readonly Task _task;
    
    MyConstructor()
    {
        _task = M1Async();
    }
    
    public async Task MyMethod()
    {
         //if the result of the async method is important 
         await _task;
    }