Как правильно объясняет Ответ Скотта , причина, по которой ваша асинхронная версия движется, даже если вы ожидаете задержек, заключается в том, что Displatcher.RunAsync
принимает делегата void
. Что касается подходящего решения, я настоятельно рекомендую избегать использования всех async
лямбд в вашем коде. Task.Run
действительно понимает, как обрабатывать Task
возвращаемые методы, но вы все еще делаете много вещей себе намного сложнее, структурируя свой код так, как вы это делаете, в частности, вы не используете тот факт, что async
методы захватить контекст синхронизации, чтобы вам не приходилось вручную маршировать код в поток пользовательского интерфейса.
Вы можете переписать ответ как:
await Task.Delay(2000);
textnew1.Text = "Dispatched";
await Task.Delay(2000);
textnew2.Text = "BackgroundTask";
Если у вас есть какая-то долго выполняемая работа без привязки к процессору, связанная с процессором, и обновление пользовательского интерфейса, которое нужно выполнить после завершения, вместо того, чтобы помещать while вещь в Task.Run
лямбду с вызовами диспетчера просто используйте Task.Run
, чтобы специально вызывать работу без привязки к ЦП, а затем делать все необходимое для запуска в контексте пользовательского интерфейса после его ожидания:
await Task.Delay(2000);
textnew1.Text = "Dispatched";
await Task.Run(() => SomeBackroundWork());
textnew2.Text = "BackgroundTask";