在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方法时动画不会冻结?

在SeperateThread上显示“请等待”窗口

您需要将窗口的创建移动到新的线程中,使用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();
}));