Если в методе есть два await Task.Run (), будет ли второй ждать завершения первого? - PullRequest
0 голосов
/ 03 сентября 2018

В моем 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 голосов
/ 03 сентября 2018

Да, они будут запускаться после друг друга. Асинхронный шаблон await состоит в том, чтобы не блокировать поток, пока метод не завершится. ОС удастся получить статус задачи. Как только оно будет завершено, оно продолжится. Между тем, пока он выполняется и, возможно, ожидает ввода-вывода или чего-либо еще, он позволит другим задачам использовать ресурсы ЦП.

0 голосов
/ 03 сентября 2018

будет ли второй ждать завершения первого?

Да. Любой код ниже первого ждут:

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 () завершить работу, чтобы пользовательский интерфейс мог обновляться.

, поскольку вы объявили OnStart как `async´, он не заблокирует пользовательский интерфейс, который будет реагировать. Поскольку у вас нет возвращаемых значений и нет кода обновления в вашем примере. Это так далеко, что мой ответ может пойти без принятия слишком много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...