从调度程序调用代理

时间:2012-10-17 12:14:56

标签: multithreading delegates invoke

我整个上午都被困在这上面,尽管看起来应该很容易(想知道我是否遗漏了一些基本的东西)。我在类中有以下代码 -

 public class myClass
 {
      private Dispatcher m_Dispatcher;

      private void myMethod() { ... }

      private void invokeTheMethod(object sender, PropertyChangedEventArgs e)
      {
           m_Dispatcher.Invoke(myMethod); //XYZ
      }

 }

调度程序附加到运行myClass实例的线程。从另一个线程调用invokeTheMethod方法,我想在m_Dispatcher的线程上运行myMethod。但是,如果我尝试运行此代码,我会在XYZ处获得一个异常,说“对象引用不是对象的实例”。这是因为我没有以委托的形式声明myMethod吗? - 我尝试了将myMethod声明为委托的不同方法,但我无法将其中的任何一个编译。任何建议都非常感谢。

谢谢, 克里斯

1 个答案:

答案 0 :(得分:0)

你得到的错误

  

对象引用不是对象的实例(NullReferenceException)

指的是字段m_Dispatcher。它是null。这就是为什么你不能在它上面调用Invoke方法。

即使有一个Dispatcher“的实例附加到该线程”,myClass也无法获取该实例。

您可以做的是在创建Dispatcher的实例时向myClass提供myClass的实例。像这样:

public class myClass
{
  // Here is the 'injection' of the instance in the constructor of this class
  public myClass(Dispatcher dispatcher) {
     m_Dispatcher = dispatcher;
  }

  private Dispatcher m_Dispatcher;

  private void myMethod() { ... }

  private void invokeTheMethod(object sender, PropertyChangedEventArgs e)
  {
       m_Dispatcher.Invoke(myMethod); //XYZ
  }
}

作为旁注,您应该阅读一些有关编码约定的内容,因为大多数C#开发社区认为外壳被认为是错误的。这是一个好的开始:http://msdn.microsoft.com/en-us/library/vstudio/w2a9a9s3.aspx