我目前正在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