2012-09-10 39 views
0
private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     new Thread(delegate() { doTest(); }).Start(); 
    } 

當doTest()包含在主窗口,如下圖,我的文本框從線更新,我可以看到文本框的值改變(所以更新值從線程工作。調用外部類調度員在主窗口工作不

public void doTest() 
     { 
      int count = 20; 
      while (count < 30) 
      { 
       Dispatcher.Invoke(new Action(() => txtBoxLog.Text = count.ToString()), null); 
       count++; 
       Thread.Sleep(500); 
      } 
     } 

但是,如果我去掉上面的代碼,並單獨的類,在主窗口類的外部放置,從線程來更新我的文本框失敗和IM沒有得到任何錯誤,但根本不改變它的價值,我使用調度器更新線程而不更新。

從doTest()I類創建內部靜態主winodwo CALSS TW

internal static MainWindow tw; 

現在我doTest()方法都遵循clsTest.cs代碼文件

internal class clsTest 
{ 
    public clsTest() { } 

    public void doTest() 
    { 
     int count = 20; 
     while (count < 30) 
     { 
      MainWindow.tw.Dispatcher.Invoke(
      new Action(() => MainWindow.tw.txtLog.Text = count.ToString()), DispatcherPriority.Background, null); 

      count++; 
      Thread.Sleep(500); 
     } 
    } 
} 

請協助訪問主窗口我查明我收到錯誤在這裏..

回答

0

幫助我查明我收到錯誤

這是您使用調度程序的部分,而不僅僅是bindingText

+0

調度程序的範圍是什麼,在UI線程內? – panindra

+0

@panindra:「範圍」是什麼意思?每個需要一個線程的線程都有一個調度程序,如果你在錯誤的調度程序上調度,你會得到異常。 –

+0

我剛纔問過,當線程在MainWindow線程之外的獨立類中運行時,是否無法使用dispathcer方法從線程調用ui控件(文本框)。我沒有得到任何錯誤,但我的文本框沒有更新線程的值。沒有例外 。 – panindra

1

你發佈的內容沒有任何明顯的錯誤。它們對我來說看起來很好,我通過在示例應用程序中運行代碼片段來檢查。我猜想這與你如何初始化你沒有顯示的靜態「tw」MainWindow實例有關。

編輯:好的,你不應該像WPF一樣自動爲你創建一個新的MainWindow實例。相反,您應該將該靜態實例設置爲指向默認實例,例如,在主窗口類的構造函數:

internal static MainWindow tw; 

public MainWindow() 
{ 
    InitializeComponent(); 
    tw = this; 
} 
+0

這是我在主窗口中tw的解除 - 「內部靜態MainWindow tw =新的MainWindow();」如果我將它聲明爲 - 「internal static MainWindow tw; - 我在運行時得到null異常。 – panindra

+0

好的,我根據您的評論更新了我的答案。 – donovan

0

你不需要初始化tw作爲tw = this而不是tw = new MainWindow()