【问题标题】:Displaying Please Wait Window on a SeperateThread在单独的线程上显示请等待窗口
【发布时间】:2016-06-27 20:44:35
【问题描述】:

我有一个方法可以将我的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 方法时动画不会冻结?

【问题讨论】:

  • 我认为导出操作应该在非UI线程中进行
  • 为什么不在单独的线程中运行ExcelExport 方法?

标签: c# wpf multithreading


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-27
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多