2016-01-28 29 views
1

Dispatcher是您可以在C#中傳遞的對象嗎?我有一個線程調用另一個線程。第二個線程給了我這個錯誤,當我嘗試做Dispatcher.CheckAccess():Dispatcher是你可以在C#中傳遞的對象嗎?

內的對象引用科目編號的非靜態字段,方法或屬性「System.Windows.Threading.Dispatcher.CheckAccess( )」。

所以我嘗試在原始類中創建一個調度器對象,並將它傳遞給第二個類,但程序不喜歡這樣並崩潰。

的代碼具有一般結構:

public public partial class MainView : UserControl{ 
    public myButtonClick(Event eventObj, Session session) 
    { 
    //does some stuff and invokes Dispatcher.CheckAccess() 
    secondClass.startProcess(passThruString); 
    } 
} 
public class SecondClass 
{ 
    public startProcess(string passThru){ 
    //does some other stuff and calls Dispatcher.CheckAccess() which throws error 
    } 
} 

通過更換Dispatcher.CheckAccess()與Dispatcher.Currentdispatcher.CheckAccess()我已經改正了錯誤,但爲什麼我就不能創建一個調度員對象?

+2

你可以顯示你的代碼和你得到的異常嗎? – juharr

+0

請看我上面的整體代碼大綱。 – Sean

+0

當你不在[MVCE](http://stackoverflow.com/help/mcve)中提供代碼時,很難幫助你解決問題。 –

回答

1

調度程序可以像C#中的任何其他對象一樣傳遞。然而,調度員無法建造,因爲構造函數是由私人:

var dispatcher = new Dispatcher(); //compile error 

是傳遞一個調度員,你需要得到其他一些已經存在的調度員。一個選項(如你在更新的問題提到)是使用Dispatcher.CurrentDispatcher

var dispatcher = Dispatcher.CurrentDispatcher; 
SomeFunction(dispatcher); 

這將創建到Dispatcher.CurrentDispatcher參考可以存儲和周圍通過。

在我自己的一個項目中,我使用調度程序來避免錯誤,例如「調用線程不能訪問此對象,因爲不同的線程擁有它」。這是因爲在這個特定的類中,後臺線程可能會嘗試對在UI線程上創建的對象執行操作。我猜你有類似的問題。

下面是我如何使用它一個小例子:

public class SomeClass 
{ 
    private readonly Dispatcher _dispatcher; 

    public SomeClass() 
    { 
    _dispatcher = Dispatcher.CurrentDispatcher; 
    } 

    public void SomeOperation() 
    { 
    InvokeIfNeeded(() => Console.WriteLine("Something")); 
    } 

    private void InvokeIfNeeded(Action action) 
    { 
    if (_dispatcher.Thread != Thread.CurrentThread) 
     _dispatcher.Invoke(action); 
    else 
     action(); 
    } 
} 

這可能不是使用調度員的最佳方式,但它演示瞭如何存儲作爲現場的一個引用,就像C#中的其他對象。

+0

不用比較線程,你可以調用CheckAccess(),這正是它的目的。 – svick

+0

謝謝!這是我需要的確切解釋。 – Sean

0

如錯誤消息所示,要調用CheckAccess(),您需要點左側的Dispatcher實例。例如,像這樣的代碼將工作:

Dispatcher dispatcher = /* something here */; 
dispatcher.CheckAccess(); 

這就解釋了爲什麼在簡單地寫SecondClassDispatcher.CheckAccess()不起作用。但那麼爲什麼確實它在MainView工作?因爲它繼承自UserControl,它有一個名爲Dispatcher的屬性。所以,當你寫Dispatcher.CheckAccess()那裏,它基本上寫的一個較短的方式:

UserControl control = this; 
control.Dispatcher.CheckAccess(); 

好了,現在你應該明白爲什麼MainView作品,爲什麼SecondClass沒有。唯一的問題是:如何使SecondClass工作?您需要做的是訪問Dispatcher的實例。但要回答這個問題,我需要問你一個問題:爲什麼你想撥打CheckAccess()

一般來說,當你想調用Dispatcher -bound對象的方法時,你應該這樣做,並且你不知道你是否在正確的線程上。但是,如果您處於這種情況,您不需要aDispatcher,您需要Dispatcher與您嘗試訪問的對象相關聯。爲了解決這個問題,您應該使用該對象的Dispatcher屬性(導致上述混淆的相同屬性)。

如果你在做別的事情,答案可能會有所不同,但我很難猜測那會是什麼。

相關問題