Ожидание Task.CompletedTask
, как я предложил в комментариях, не будет работать.Я проверил сгенерированный код конечного автомата и увидел, что когда задание возвращается в завершенном состоянии, конечный автомат переходит к следующему шагу без уступок.
Мне неизвестно о готовой задаче, которая запускаетсяв неполном состоянии и каким-то образом автоматически переходит в завершенное состояние, не имея предварительно определенного времени.Хитрость заключается в том, чтобы заставить проверку конечного автомата завершиться неудачно, прежде чем таймер установит задачу как завершенную, чтобы он выполнял, но не ждал слишком долго, чтобы вы теряли время.По мере того, как аппаратное обеспечение становится лучше, сегодня может быть недостаточно времени.
Если есть лучший способ или механизм, такой как описанный мной, я приветствую лучший ответ.
private async Task PrintMe(object sender, System.Windows.RoutedEventArgs e)
{
PrintDialog print = new PrintDialog();
int savedSelectedIndex = this.tabControl.SelectedIndex;
if (print.ShowDialog()) // == true is redundant; don't do that.
{
for (int i = 0; i < this.tabControl.Items.Count; i++)
{
this.tabControl.SelectedIndex = i;
// Allow the UI to update by yielding to the message loop
// or whatever it is that controls the UI thread.
await Task.Delay(100);
print.PrintVisual(this.MainGrid, "Report");
}
}
// And of course, "be kind, rewind"
this.tabControl.SelectedIndex = savedSelectedIndex;
}
Обратите внимание, что в цикле теперь используется tabControl.Items.Count
вместо жесткого кодирования количества вкладок.Это поможет с обслуживанием, если вы когда-нибудь измените количество вкладок.
Теперь, когда PrintMe
равно async
, вам придется иметь дело с этим в восходящем направлении.Отсутствие контекста - это столько советов, сколько я могу вам дать.