我有一个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...";
答案 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...";
}