使用Task.Delay将同步调用转换为异步

时间:2019-05-04 21:10:53

标签: c# wpf asynchronous

我有一个WPF应用程序,该应用程序在异步事件中调用PrintDialog.PrintVisual(),事件的第一行是对await Task.Delay(1);的调用,以将控件返回到UI(显示繁忙的Indicator动画)在打印过程完成时。

我从没见过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 个答案:

答案 0 :(得分:1)

使用

await Task.Delay(1) 
从编译器的角度来看,

将使该方法异步,但是不会使该操作异步。要做的就是释放UI线程1ms。

要使操作异步,可以将其放在单独的函数中并作为任务启动。

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() ;
}

或者您可以使用lambda函数执行相同操作

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...";
}