асинхронное выполнение отличается от ожидаемого - PullRequest
1 голос
/ 30 сентября 2019

в следующем фрагменте

    private async void FinishCommandExecute()
    {
        Console.WriteLine("FinishCommandExecute_1");
        _granularBlobAnalyzer.SaveResult(SampleID, Operator, Comments);
        Console.WriteLine("FinishCommandExecute_2");
        await Task.Run(() => FlushCommandExecute());
        Console.WriteLine("FinishCommandExecute_3");
        State = GBAState.IDLE;
        Console.WriteLine("FinishCommandExecute_4");
    }

    private async void FlushCommandExecute()
    {
        Console.WriteLine("FlushCommandExecute_1");
        State = GBAState.FLUSHING;
        Console.WriteLine("FlushCommandExecute_2");
        await Task.Run(() => _granularBlobAnalyzer.Flush()); // Task to wrap sync method
        Console.WriteLine("FlushCommandExecute_3");
        State = GBAState.STOPPED;
        Console.WriteLine("FlushCommandExecute_4");
    }

Я вызываю FinishCommandExecute (она связана с кнопкой как команда), и я ожидаю, что команда конца вызовет сброс введите команду и дождитесь ее завершения, но она не дождется окончания ожидания внутри команды сброса ... и выполнение продолжится

, если вы посмотрите на комментарий, я бы ожидал следующее в консоли

  • FinishCommandExecute_1
  • FinishCommandExecute_2
  • FlushCommandExecute_1
  • FlushCommandExecute_2
  • * FlueCom1024 * FlushCommandExecute_4
  • Finish CommandExecute_3
  • Finish CommandExecute_4

, в то время как фактическое значение:

  • FinishCommandExecute_1
  • FinishCommandExecute_2
  • FlushCommandExecute_1
  • FlushCommandExecute_2
  • Finish CommandExecute_3
  • FlushCommandExecute_3
  • FlushCommandExecute_4

почему асинхронное ожидание не запускается при выполнении задачи во втором асинхронном методе

1 Ответ

5 голосов
/ 30 сентября 2019

FlushCommandExecute - это асинхронная пустота , поэтому он запускает незамеченным , вы не можете ждать \ ждать его, если не используете какой-то механизм синхронизации, такой как AutoResetEvent ect илирефакторинг вашего кода для вызова async Task и ожидания этого.

private async void FlushCommandExecute() => await FlushCommand();

private async void FinishCommandExecute()
{
    ...
    await FlushCommand();
    ...
}

private async Task FlushCommand()
{
     ...
}
...