不同 STA 线程中的 WPF Recreation window
WPF Recreation window in different STA thread
我需要创建 window 并在我的主要 window 渲染时加载 gif。我已经阅读了一些文章并决定为此目的我需要创建新线程。我在 this article
中做到了
结果我有这样的东西:
LoadingDialog _loadingDlg;
Thread loadingThread;
public void ShowLoading()
{
loadingThread = new Thread(new ThreadStart(loadingThreadWork));
loadingThread.SetApartmentState(ApartmentState.STA);
loadingThread.Start();
}
private void loadingThreadWork()
{
_loadingDlg = new LoadingDialog();
_loadingDlg.Show();
System.Windows.Threading.Dispatcher.Run();
}
public void HideLoading()
{
_loadingDlg.Dispatcher.InvokeShutdown();
}
我第一次调用 ShowLoading()
然后 HideLoading()
一切正常。但是当我第二次调用 ShowLoading()
时,我在
处遇到异常
_loadingDlg.Show();
有消息 The calling thread cannot access this object because a different thread owns it
。
怎么会这样? _loadingDlg
是在上一行创建的,并且在同一个线程中。
在 loadingThreadWork
中,您正在创建控件,在第一个 运行 之前,它是一个 null
,因此您第一次成功。但是,您是在另一个线程中创建对话框,该线程被标记为控件的所有者。
下次调用 loadingThreadWork
时,控件不为空,并且 ant 从不同的线程更改它(它是不同的线程,因为你再次创建它) 导致你遇到异常。
当您使用 WPF
时,您可能应该从线程切换到 async
操作,这比您当前的解决方案更具可读性、可支持性和可预测性。
我需要创建 window 并在我的主要 window 渲染时加载 gif。我已经阅读了一些文章并决定为此目的我需要创建新线程。我在 this article
中做到了结果我有这样的东西:
LoadingDialog _loadingDlg;
Thread loadingThread;
public void ShowLoading()
{
loadingThread = new Thread(new ThreadStart(loadingThreadWork));
loadingThread.SetApartmentState(ApartmentState.STA);
loadingThread.Start();
}
private void loadingThreadWork()
{
_loadingDlg = new LoadingDialog();
_loadingDlg.Show();
System.Windows.Threading.Dispatcher.Run();
}
public void HideLoading()
{
_loadingDlg.Dispatcher.InvokeShutdown();
}
我第一次调用 ShowLoading()
然后 HideLoading()
一切正常。但是当我第二次调用 ShowLoading()
时,我在
_loadingDlg.Show();
有消息 The calling thread cannot access this object because a different thread owns it
。
怎么会这样? _loadingDlg
是在上一行创建的,并且在同一个线程中。
在 loadingThreadWork
中,您正在创建控件,在第一个 运行 之前,它是一个 null
,因此您第一次成功。但是,您是在另一个线程中创建对话框,该线程被标记为控件的所有者。
下次调用 loadingThreadWork
时,控件不为空,并且 ant 从不同的线程更改它(它是不同的线程,因为你再次创建它) 导致你遇到异常。
当您使用 WPF
时,您可能应该从线程切换到 async
操作,这比您当前的解决方案更具可读性、可支持性和可预测性。