如何從另一個類中運行的另一個線程更新UI我目前正在編寫我的第一個關(guān)于C#的程序,我對該語言非常陌生(迄今為止只用于C)。我做了很多研究,但所有的答案都太籠統(tǒng)了,我根本無法解決問題。所以這里是我(非常常見)的問題:我有一個WPF應(yīng)用程序,它從用戶填充的幾個文本框中獲取輸入,然后使用它來對它們進行大量計算。它們應(yīng)該花費大約2-3分鐘,所以我想更新進度條和文本塊,告訴我當(dāng)前的狀態(tài)。此外,我需要存儲用戶的UI輸入并將它們提供給線程,所以我有第三個類,我用它來創(chuàng)建一個對象,并希望將此對象傳遞給后臺線程。顯然我會在另一個線程中運行計算,因此UI不會凍結(jié),但我不知道如何更新UI,因為所有計算方法都是另一個類的一部分。經(jīng)過大量的研究后,我認(rèn)為最好的方法是使用調(diào)度員和TPL,而不是背景工作者,這里有一個非常簡單的程序結(jié)構(gòu):public partial class MainWindow : Window{
public MainWindow()
{
Initialize Component();
}
private void startCalc(object sender, RoutedEventArgs e)
{
inputValues input = new inputValues();
calcClass calculations = new calcClass();
try
{
input.pota = Convert.ToDouble(aVar.Text);
input.potb = Convert.ToDouble(bVar.Text);
input.potc = Convert.ToDouble(cVar.Text);
input.potd = Convert.ToDouble(dVar.Text);
input.potf = Convert.ToDouble(fVar.Text);
input.potA = Convert.ToDouble(AVar.Text);
input.potB = Convert.ToDouble(BVar.Text);
input.initStart = Convert.ToDouble(initStart.Text);
input.initEnd = Convert.ToDouble(initEnd.Text);
input.inita = Convert.ToDouble(inita.Text);
input.initb = Convert.ToDouble(initb.Text);
input.initc = Convert.ToDouble(initb.Text);
}
catch
{
MessageBox.Show("Some input values are not of the expected Type.", "Wrong Input", MessageBoxButton.OK, MessageBoxImage.Error);
}
Thread calcthread = new Thread(new ParameterizedThreadStart(calculations.testMethod);
calcthread.Start(input);
}public class inputValues{
public double pota, potb, potc, potd, potf, potA, potB;
public double initStart, initEnd, inita, initb, initc;}public class calcClass{如果有人簡單解釋如何從testmethod內(nèi)部更新UI,我將非常感激。由于我是C#和面向?qū)ο缶幊痰男率郑液芸赡懿粫斫馓珡?fù)雜的答案,但我會盡我所能。此外,如果某人有更好的想法(可能使用背景工作者或其他任何東西),我很樂意看到它。
3 回答

largeQ
TA貢獻(xiàn)2039條經(jīng)驗 獲得超8個贊
你應(yīng)該使用Dispatcher
更新UI線程上的控件,并且正確地說,長時間運行的進程不應(yīng)該在UI線程上運行。即使您在UI線程上異步運行長時間運行的進程,它仍然可能導(dǎo)致性能問題。
應(yīng)該注意的是,Dispatcher.CurrentDispatcher
它將返回當(dāng)前線程的調(diào)度程序,而不一定是UI線程。我認(rèn)為你可以使用它Application.Current.Dispatcher
來獲取對UI線程的調(diào)度程序的引用,如果你可以使用它,但如果沒有,你將不得不將UI調(diào)度程序傳遞給你的后臺線程。
通常我使用任務(wù)并行庫進行線程操作而不是BackgroundWorker
。我發(fā)現(xiàn)它更容易使用。
例如,
Task.Factory.StartNew(() => SomeObject.RunLongProcess(someDataObject));
哪里
void RunLongProcess(SomeViewModel someDataObject){ for (int i = 0; i <= 1000; i++) { Thread.Sleep(10); // Update every 10 executions if (i % 10 == 0) { // Send message to UI thread Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.Normal, (Action)(() => someDataObject.ProgressValue = (i / 1000))); } }}
- 3 回答
- 0 關(guān)注
- 630 瀏覽
添加回答
舉報
0/150
提交
取消