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#开发社区都认为您的外壳是错误的。这是一个好的开始:你好,谢谢!非常尴尬-我以为我已经初始化了调度器(省略构造函数代码是故意的)。不过,我认为你帮我省了几个小时的痛苦)