在Property Getter中使用Dispatcher.Invoke()

时间:2014-05-09 21:49:22

标签: c# wpf multithreading

我有一个属性,在访问时会抛出一条带有消息的异常:"调用线程无法访问此对象,因为另一个线程拥有它。"

我试图通过在getter中使用Dispatcher.Invoke()来解决它,但由于“无法访问非静态方法'调用'”而无法进行编译。在静态环境中。

public override bool Enabled
{
  get
  {
    return Dispatcher.Invoke(() => (ISomethingView) View).ViewModel.Enabled;
    }
  }
}

是否有更简单的方法可以在WPF中使我的属性保持线程安全?

3 个答案:

答案 0 :(得分:1)

您使用的是Dispatcher类型,它没有静态Invoke方法。 您需要Instance Dispatcher。

试试这个:

public override bool Enabled
{
  get
  {
    return Application.Current.Dispatcher.Invoke(() => (ISomethingView) View).ViewModel.Enabled;
  }
}

答案 1 :(得分:0)

我假设你的 View 对象是DispatcherObject,它不允许从另一个线程访问。如果是这样,那么执行以下操作:

public override bool Enabled
{
  get
  {
    return View.Dispatcher.Invoke( () => ((ISomethingView)View).ViewModel.Enabled );
  }
}

答案 2 :(得分:0)

您可以按如下方式使用Dispatcher.CurrentDispatcher:

public override bool Enabled
{
    get
    {
        return System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(() => { return ((ISomethingView)View).ViewModel.Enabled; });
    }
}