Multithreading 从调度器调用委托

Multithreading 从调度器调用委托,multithreading,delegates,invoke,Multithreading,Delegates,Invoke,我整个上午都在坚持这一点,尽管这看起来应该很容易(想知道我是否遗漏了一些基本的东西)。我在一个类中有以下代码- public class myClass { private Dispatcher m_Dispatcher; private void myMethod() { ... } private void invokeTheMethod(object sender, PropertyChangedEventArgs e) {

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

 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声明为委托,但我无法编译任何一种方法。非常感谢您的任何建议

谢谢, 克里斯

你得到的错误

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

指的是
m_Dispatcher
字段。它是空的。这就是为什么不能对其调用
Invoke
方法的原因

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

创建
myClass
的实例时,可以将
Dispatcher
的实例提供给
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#开发社区都认为您的外壳是错误的。这是一个好的开始:

你好,谢谢!非常尴尬-我以为我已经初始化了调度器(省略构造函数代码是故意的)。不过,我认为你帮我省了几个小时的痛苦)