我目前正在C#上編寫我的第一個程序,而且我對該語言非常陌生(以前只用於C語言)。我做了很多研究,但所有的答案都過於籠統,我根本無法解決問題。如何更新另一個線程中運行的另一個線程的用戶界面
所以在這裏我的(很常見)問題: 我有一個WPF應用程序,它接受來自用戶填充的幾個文本框的輸入,然後使用它進行大量的計算。他們應該花2-3分鐘左右,所以我想更新一個進度條和一個文本塊,告訴我目前的狀態是什麼。 另外我需要存儲來自用戶的UI輸入並將它們提供給線程,所以我有第三個類,我使用它來創建一個對象並希望將此對象傳遞給後臺線程。 顯然我會在另一個線程中運行計算,所以UI不會凍結,但我不知道如何更新UI,因爲所有計算方法都是另一個類的一部分。 經過大量的研究,我認爲最好的方法是使用調度員和TPL,而不是背景工作者,但老實說,我不知道他們是如何工作的,經過大約20小時的試驗和其他答案的錯誤,我決定自己問一個問題。
這裏我的程序的結構非常簡單:
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
{
public void testmethod(inputValues input)
{
Thread.CurrentThread.Priority = ThreadPriority.Lowest;
int i;
//the input object will be used somehow, but that doesn't matter for my problem
for (i = 0; i < 1000; i++)
{
Thread.Sleep(10);
}
}
}
,如果有人有一個簡單的解釋如何從TestMethod的內部更新UI,我將非常感激。由於我是C#和麪向對象編程的新手,我很可能不會理解太複雜的答案,儘管我會盡我所能。
此外,如果有人有一個更好的想法一般(可能使用backgroundworker或其他),我很樂意看到它。
這是一個古老而又回答的問題,但我非常受歡迎,儘管我會分享這個給那些希望在線程之間實現一個非常簡單的「進度記者」的人。使用課程進度。 Stephan Cleary在這篇文章中詳細介紹了實現:http://blog.stephencleary.com/2012/02/reporting-progress-from-async-tasks.html。 –
SeanOB
2016-11-10 04:55:25