2012-10-17 47 views
0

我一直堅持這一整個上午,即使它看起來應該很容易(想知道我是否缺少一些基本的東西)。我有一個類中的以下代碼 -調用調度員的代理

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聲明爲委託,但我無法讓它們中的任何一個進行編譯。任何建議都非常感謝。

謝謝, 克里斯

回答

0

錯誤你

對象引用一個對象(的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

+0

嗨,謝謝!非常尷尬 - 我原以爲我已經初始化調度員(構造函數代碼的遺漏是故意的)。不過,我想你已經救了我幾個小時的痛苦) –