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



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

我从未见过这种Task.Delay的使用和在谷歌中搜索我没有找到任何执行类似操作的代码,所以我想知道它是否正确使用该功能,或者是否有更好的方法。

(我知道这个问题可能是题外话,但我不知道更好的地方可以问,如果你认为这个问题有更好的地方告诉我,我会把它带到那里)

编辑

这是事件中的代码:

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

使用

await Task.Delay(1) 

将从编译器的角度来看使方法异步,但不会使操作异步。它所做的只是释放 UI 线程 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() ;
}

或者您可以使用 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...";
}

最新更新