如果我在方法中有两个等待Task.Run(),第二个会等待第一个完成吗?

时间:2018-09-03 08:09:03

标签: c# asynchronous

在我的OnStart中,我需要运行获取数据的代码,然后运行CheckScore方法。 GetData必须在CheckScore运行之前完成。这也是调用方法的正确方法吗? Method()CheckScore()都不异步运行。

有人可以告诉我这样做之间是否有区别:

protected override async void OnStart()
{
    await Task.Run(() => Method());
}

public void Method() 
{
    App.DB.GetData();
    PointChecker.CheckScore();
}

或类似这样:

protected override async void OnStart()
{
    await Task.Run(() => Method());
    await Task.Run(() => PointChecker.CheckScore());
}

public void Method() 
{
    App.DB.GetData();
}

2 个答案:

答案 0 :(得分:2)

  

第二个会等待第一个完成吗?

是的。第一次等待以下的任何代码:

await Task.Run(() => Method());

等待,直到执行结束。

  

有人可以告诉我是否有区别...

在您的简化示例中,基本上没有没有差异。您有一个async方法,该方法在内部同步和顺序运行。

如果您希望在此期间完成其他任何工作,则可以稍后设置等待:

protected override async void OnStart()
{
    Task methodTask = Task.Run(() => Method());

    // do anything here while the Task runs

    await methodTask; // wait here so that CheckScore() is not started yet

    await Task.Run(() => PointChecker.CheckScore());
}
  

我本以为使用Await将允许OnStart()完成,以便UI可以更新。

由于您已将OnStart声明为“异步”,因此不会阻塞UI,UI会保持响应状态。由于您的示例中没有返回值,也没有更新代码。到目前为止,我的回答是可以接受的,而无需承担太多责任。

答案 1 :(得分:1)

是的,它们将相互运行。等待异步模式的要点是,直到方法完成后才阻塞线程。操作系统将设法获取任务状态。完成后,它将继续。同时,当它执行时,也许在等待I / O或其他任何执行时,它将允许其他任务使用CPU资源。