我需要从同一进程创建两个(或更多)WPF 窗口。但是窗口必须由单独的线程处理,因为它们不应该能够相互阻塞。我该怎么做?
在 WinForms 中,这是通过以下方式实现的:
- 开始一个新话题
- 从新线程创建表单
- 使用表单作为参数调用 Application.Run
但是我如何在 WPF 中执行相同的操作?
最佳答案
如msdn状态:
private void NewWindowHandler(object sender, RoutedEventArgs e)
{
Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
}
private void ThreadStartingPoint()
{
Window1 tempWindow = new Window1();
tempWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}
编辑: 这是一个旧答案,但由于它似乎经常被访问,我还可以想到以下修改/改进(未测试)。
如果您想关闭这样的窗口,只需从线程(委托(delegate))外部保留对 Window 对象的引用,然后对其调用 close ,如下所示:
void CloseWindowSafe(Window w)
{
if (w.Dispatcher.CheckAccess())
w.Close();
else
w.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(w.Close));
}
// ...
CloseWindowSafe(tempWindow);
如果新线程可能被终止(强制中止),与评论中的问题一致:
private void ThreadStartingPoint()
{
try{
Window1 tempWindow = new Window1();
tempWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}
catch(ThreadAbortException)
{
tempWindow.Close();
System.Windows.Threading.Dispatcher.InvokeShutdown();
}
//the CLR will "rethrow" thread abort exception automatically
}
免责声明:不要在家里这样做,中止线程(几乎总是)违反最佳实践。线程应该通过任何各种同步技术来优雅地处理,或者在这种情况下,只需通过调用 window.Close()
关于wpf - 如何在单独的线程上创建和显示 WPF 窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1111369/