【发布时间】:2012-11-20 11:37:23
【问题描述】:
根据我们的要求,我们必须在新的 UI 线程中打开一个 WPF 窗口。
我们正在使用以下代码在主 UI 线程的新 UI 线程中打开窗口:
Thread winthread = new Thread(new ThreadStart(() =>
{
SynchronizationContext.SetSynchronizationContext(
new DispatcherSynchronizationContext(
Dispatcher.CurrentDispatcher));
Window windowObj = new Window();
Grid gridObj = new Grid();
MyUserControl ctrl = new MyUserControl();
gridObj.Children.Add(ctrl);
windowObj.Content = gridObj;
windowObj.Show();
System.Windows.Threading.Dispatcher.Run();
}));
winthread.IsBackground = true;
winthread.SetApartmentState(ApartmentState.STA);
winthread.Start();
执行上述代码时,窗口将显示MyUserControl 作为内容。
我正在做一些动画,比如在鼠标双击事件上翻转我的用户控件。
当我双击它时,应用程序开始抛出以下异常:
调用线程无法访问此对象,因为另一个线程拥有它。
在线System.Windows.Threading.Dispatcher.Run().
谁能提出这个问题的解决方案?
【问题讨论】:
-
抱歉学究了,但这是因为线程无法访问该对象,因为不同的线程拥有它。您不完全理解哪一点,也许我们可以提供帮助?
-
@ Kieren Johnstone :- 更清楚地说,我的动画应该在逻辑上完美运行,因为它在创建窗口的同一线程上运行,它不应该抛出任何异常。
-
您的代码看起来不错 - 这对我来说运行良好(仅用
Button替换MyUserControl)。你能显示MyUserControl的代码吗?你能展示你是如何调用这个代码的吗?从现有的 WPF 应用程序?控制台应用程序? -
@J... 抱歉,我无法分享 MyUserControl 的完整代码,因为它非常庞大并且分布在多个类中,但我可以简要介绍一下它的功能。它包含一个标签,该标签通过实时数据不断更新。当我们翻转用户控件时,我正在创建与该特定用户控件相对应的图形,然后它将开始在图形上绘制实时数据
标签: c# wpf multithreading