Использование Task.Delay для преобразования синхронного вызова в асинхронный - PullRequest
0 голосов
/ 05 мая 2019

У меня есть приложение WPF, которое вызывает PrintDialog.PrintVisual() в асинхронном событии, и первой строкой события является вызов await Task.Delay(1); для возврата элемента управления в пользовательский интерфейс (показать анимацию индикатора занятости) во время процесса печатиготово.

Я никогда не видел такого использования Task.Delay, и в поиске в Google я не нашел ни одного кода, который делает что-то подобное, поэтому мне интересно, правильно ли это использование функции или еслиесть лучший подход.

(я знаю, что этот вопрос может быть не по теме, но я не знаю лучшего места, чтобы спросить, если вы считаете, что есть лучшее место для этого вопроса, скажите мне, и явозьмите его там)

Редактировать

это код внутри события:

            await Task.Delay(1);
            IsBusy.Visibility = Visibility.Visible;
            BusyIndicator.Header = "Imprimiendo...";
            var printDialog = new PrintDialog();
            if ((bool)printDialog.ShowDialog())
                printDialog.PrintVisual(PrintCanvas, "Iprimiendo Venta " + _vm.Sell.Id);
            IsBusy.Visibility = Visibility.Hidden;
            BusyIndicator.Header = "Cargando...";

1 Ответ

1 голос
/ 05 мая 2019

Использование

await Task.Delay(1) 

сделает метод асинхронным с точки зрения компилятора, но не сделает операцию асинхронной. Все, что он сделает, это освободит поток пользовательского интерфейса на 1 мс.

Чтобы сделать операцию асинхронной, вы можете поместить ее в отдельную функцию и запустить как задачу.

private async Task DoPrint()
{
  IsBusy.Visibility = Visibility.Visible;
  BusyIndicator.Header = "Imprimiendo...";
  var printDialog = new PrintDialog();
  if ((bool)printDialog.ShowDialog())
      printDialog.PrintVisual(PrintCanvas, "Iprimiendo Venta " + _vm.Sell.Id);
  IsBusy.Visibility = Visibility.Hidden;
  BusyIndicator.Header = "Cargando...";
}

private void EventHandler()
{ 
  await DoPrint() ;
}

или вы можете сделать то же самое, используя лямбда-функцию

private void EventHandler()
{ 
  await Task.Run ( () => 
  {
    IsBusy.Visibility = Visibility.Visible;
    BusyIndicator.Header = "Imprimiendo...";
    var printDialog = new PrintDialog();
    if ((bool)printDialog.ShowDialog())
        printDialog.PrintVisual(PrintCanvas, "Iprimiendo Venta " + _vm.Sell.Id);
    IsBusy.Visibility = Visibility.Hidden;
    BusyIndicator.Header = "Cargando...";
  });
}

Однако в вашем случае вы, вероятно, хотите, чтобы только некоторые из них были асинхронными.

Полагаю, это только вызов pringDialog.PrintVisual (), который должен быть асинхронным, поэтому достаточно будет запустить его в задаче.

private void EventHandler()
{ 
  IsBusy.Visibility = Visibility.Visible;
  BusyIndicator.Header = "Imprimiendo...";
  var printDialog = new PrintDialog();
  if ((bool)printDialog.ShowDialog())
  {
      await Task.Run ( () => printDialog.PrintVisual(PrintCanvas, "Iprimiendo Venta " + _vm.Sell.Id) ) ;
  }    
  IsBusy.Visibility = Visibility.Hidden;
  BusyIndicator.Header = "Cargando...";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...