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);
}
}
}
請協助訪問主窗口我查明我收到錯誤在這裏..
調度程序的範圍是什麼,在UI線程內? – panindra
@panindra:「範圍」是什麼意思?每個需要一個線程的線程都有一個調度程序,如果你在錯誤的調度程序上調度,你會得到異常。 –
我剛纔問過,當線程在MainWindow線程之外的獨立類中運行時,是否無法使用dispathcer方法從線程調用ui控件(文本框)。我沒有得到任何錯誤,但我的文本框沒有更新線程的值。沒有例外 。 – panindra