0

我在这里讨论的问题基本相同:http: //khason.net/blog/dependency-property-getters-and-setters-in-multithreaded-environment/

public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.RegisterAttached("MyProperty", typeof(bool),
        typeof(MyObject), new PropertyMetadata(new PropertyChangedCallback(OnMyPropertyChanged)));

public static bool GetMyProperty(DependencyObject obj)
{
    return (bool)obj.GetValue(MyPropertyProperty);     <<<<<
}

public static void SetMyProperty(DependencyObject obj, bool value)
{
    obj.SetValue(MyPropertyProperty, value);
}

如果从后台线程调用标记为“<<<<<”的行,Silverlight 会引发 InvalidOperationException,我的应用程序可能会死锁。

不幸的是,博客文章中的解决方案不起作用,因为 Dispatcher 类的 Silverlight 版本隐藏了同步的 Invoke 方法——只有 BeginInvoke 被标记为 public。

4

2 回答 2

5

在主线程中,在生成后台线程之前,将 的值保存SynchronizationContext.Current在一个名为context可访问的变量中,以供生成的线程访问。然后尝试以下代码,

bool result = false;
context.Send((c) => result = YourClass.GetMyProperty(obj), null);

您可能要考虑重写静态方法以检查它是否在正确的线程中,如果不是,则使用隐藏SynchronizationContext.Current的值临时切换到正确的线程以检索该值。

于 2009-07-13T16:52:50.527 回答
0

您可以将 BeginInvoke 与触发回调的手动重置事件结合使用。

于 2009-07-13T16:28:55.253 回答