【问题标题】:Invoking Delegates from a dispatcher从调度程序调用委托
【发布时间】:2012-10-17 12:14:55
【问题描述】:

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

 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 声明为委托,但我无法编译它们中的任何一个。任何建议都非常感谢。

谢谢, 克里斯

【问题讨论】:

    标签: multithreading delegates invoke


    【解决方案1】:

    你得到的错误

    对象引用不是对象的实例 (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# 开发社区都认为您的大小写错误。这是一个好的开始:http://msdn.microsoft.com/en-us/library/vstudio/w2a9a9s3.aspx

    【讨论】:

    • 您好,谢谢!非常尴尬——我以为我已经初始化了调度程序(构造函数代码的省略是故意的)。不过,我认为您为我节省了几个小时的痛苦)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2021-12-14
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多