在SeperateThread上显示“请等待”窗口
本文关键字:等待 请等待 窗口 SeperateThread 显示 | 更新日期: 2023-09-27 17:51:17
我有一个方法,可以将DataGrid
的内容导出到CSV
文件中。我试图显示一个有动画的Window
,让用户等待。
然而,当我显示Window
时,动画会冻结,所以我认为这是因为excel方法在同一个线程上运行时会冻结。
到目前为止,我所尝试的就是这样;
var waitWindow = new PleaseWaitWindow();
var newWindowThread = new Thread(() =>
{
waitWindow.Show();
System.Windows.Threading.Dispatcher.Run();
});
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
ExcelExport();
waitWindow.Close();
但这会导致错误;
The calling thread cannot access this object because a different thread owns it.
如何启动一个新线程,以便在导出excel方法时动画不会冻结?
您需要将窗口的创建移动到新的线程中,使用ShowDialog
确保它通过自己的Dispatcher
阻止并关闭它。
PleaseWaitWindow waitWindow = null;
var newWindowThread = new Thread(() =>
{
waitWindow = new PleaseWaitWindow();
waitWindow.ShowDialog();
}
);
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.Start();
ExcelExport();
waitWindow.Dispatcher.BeginInvoke(new Action(() =>
{
waitWindow.Close();
}));
在尝试关闭waitWindow
之前,只需确保它已创建,某种IPC屏障在这里会很好。例如(快速和肮脏(:
PleaseWaitWindow waitWindow = null;
AutoResetEvent loaded = new AutoResetEvent(false);
var newWindowThread = new Thread(() =>
{
waitWindow = new PleaseWaitWindow();
loaded.Set();
waitWindow.ShowDialog();
});
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.Start();
ExcelExport();
loaded.WaitOne();
waitWindow.Dispatcher.BeginInvoke(new Action(() =>
{
waitWindow.Close();
}));