Sat*_*nan 11 wpf multithreading timeline
我有一个WPF应用程序,由客户端软件调用.它第一次工作正常.当我从客户端软件关闭WPF应用程序并再次加载WPF应用程序(不关闭其间的客户端软件))时,它会引发异常,因为"属性元数据已经注册为"时间轴"属性"为以下代码:
Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline),
new FrameworkPropertyMetadata { DefaultValue = 5 });
Run Code Online (Sandbox Code Playgroud)
然后,我从我的应用程序评论了上面的代码行,并再次重复了我上面提到的相同场景,它在Run()中抛出一个异常,因为"调用者线程无法访问此对象,因为另一个线程拥有它".
下面是我在WPF应用程序中使用Timeline属性的方法.
public void start()
{
Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline),
new FrameworkPropertyMetadata { DefaultValue = 5 });
//Property Metadata is already registered for the "Timeline" property.
Run();
// The caller thread cannot access this object because a different thread owns it.
}
Run Code Online (Sandbox Code Playgroud)
Roh*_*ats 27
您应该始终覆盖静态构造函数中的元数据.您不需要覆盖每个实例或方法.
在类的静态构造函数中移动此代码:
Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline),
new FrameworkPropertyMetadata { DefaultValue = 5 });
Run Code Online (Sandbox Code Playgroud)
来自MSDN:
必须在属性系统使用该属性之前完成依赖项属性的覆盖元数据(这相当于实例化注册属性的对象的特定实例的时间).必须在提供自身的类型的静态构造函数中执行对OverrideMetadata的调用,作为OverrideMetadata的forType参数.
在这里阅读更多 - 如何覆盖元数据?
您无法从后台线程修改UI内容,将其放在UI调度程序上,如下所示:
App.Current.Dispatcher.Invoke(new Action(() => Run()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7832 次 |
| 最近记录: |