【发布时间】:2019-05-06 19:36:04
【问题描述】:
我在不同的线程上创建了新窗口,因为它有繁重的 UI 操作,这样做是为了让我的主窗口顺利运行。一切都很完美。
但这里有个问题:
如何访问新创建的窗口?
致电Dispatcher.Run() 后,我无法再操纵visualisationWindow。我想继续访问那个新创建的窗口对象。
这是我的窗口的创建方式:
private void CreateVisualisationWindow()
{
Thread VisualisationWIndowThread = new Thread(new ThreadStart(ThreadStartingPoint));
VisualisationWIndowThread.SetApartmentState(ApartmentState.STA);
VisualisationWIndowThread.IsBackground = true;
VisualisationWIndowThread.Start();
}
private void ThreadStartingPoint()
{
Visualisation visualisationWindow = new Visualisation();
visualisationWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}
我也尝试通过System.Windows.Threading.Dispatcher.FromThread(VisualisationWIndowThread) 访问它,但似乎我误解了一些核心内容。
【问题讨论】:
-
使用多个 ui 线程是您在技术上可以做的事情之一,但几乎总是一个坏主意。我认为使用一个 ui 线程的不同方法可能是一个更好的计划。您的可视化窗口实际上是做什么的?作为替代方案,为什么需要访问实际窗口?我希望使用某种与 UI 无关的视图模型,它可以处理多个线程。
-
@Andy,只有多个 ui 线程,因为第二个窗口包含大量使用 UI 线程的 WinForms 元素(screenBG.Render() 其中 screenBG 是 BufferedGraphics 类型 - 该方法只能在 UI 线程上执行) 并且即使使用异步方法也无法避免它。用于展示一些科学数据
-
我不熟悉screenbg.render。你必须用那个吗?我在想也许是 writeablebitmap。在后台线程上处理,转换为位图,冻结并传回。虽然....只是构建一个 wbm 非常快,只要您在更改之间释放一点 ui 线程,您就可以构建非常快速变化的图像。
标签: c# wpf multithreading