C# 如果我有两个等待任务。Run()';在方法中,第二个将等待第一个完成吗?

C# 如果我有两个等待任务。Run()';在方法中,第二个将等待第一个完成吗?,c#,asynchronous,C#,Asynchronous,在我的OnStart中,我需要运行获取数据的代码,然后运行CheckScore方法GetData必须在运行CheckScore之前完成。这也是调用方法的正确方法吗?Method()或CheckScore()都不是异步运行的 有人能告诉我这样做是否有区别: protected override async void OnStart() { await Task.Run(() => Method()); } public void Method() { App.DB.Get

在我的
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();
}
或者像这样:

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();
}
第二个会等待第一个完成吗

对。第一个代码下面的任何代码都将等待:

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
声明为'async',因此它不会阻止UI,UI将保持响应。因为在您的示例中没有返回值和更新代码。这就是我的答案,不需要假设太多。

是的,它们将互相追逐。等待异步模式的要点是,在方法完成之前不阻塞线程。操作系统将设法获取任务的状态。一旦完成,它将继续进行。同时,当它被执行时,或者在等待I/O或其他执行时,它将允许其他任务使用CPU资源。

请记住,
wait
是“如果正确的方法尚未完成,则暂停此方法”。如果您认为它做了其他事情,那么您可能弄错了。@Fildor-
async
从来都不是签名的一部分。它是该方法的一个实现细节,恰好出现在一个奇怪的地方,使它看起来可能是签名的一部分。这就是为什么接口不能将方法标记为
async
,并且不需要在虚拟/重写方法之间进行匹配。您试图实现什么?如果希望这些方法按顺序执行,那么只需调用
Method();CheckScore()不包含所有任务/等待内容。@Alan2如果用户界面准备就绪不需要完成这些方法,您只需启动并忘记即可。i、 e.调用
Task。运行
而不等待。@SelmanGenç但如果您这样做,请抽出一点时间考虑异常处理。