我一直在努力解决这个问题,我似乎并不是唯一一个。关于这个主题有很多线索,但是,似乎没有一个对我有用。希望有人能指出我正确的方向。
摘要:我创建了一个包含许多控件的窗体。用户可以设置这些控件,然后“开始”测试。这会触发一个线程,所以我仍然可以在测试期间访问Windows窗体(可以持续数周)。我想在这个帖子中更新UI,但是,我还没弄清楚如何做到这一点。
我编写了一个非常小的Windows窗体应用程序,认为使用它来解释我的问题会更容易,然后我可以使用此处给出的建议来修复我的大问题。
这是我的小程序的代码,目前无法编译
using System;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(() => startNewThread());
thread.Start();
}
public static void startNewThread()
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
string text = string.Format("Time: [{0}]", i);
label1.Invoke((Action)delegate { label1.Text = text; });
}
}
}
}
我尝试使用@JaredPar在this帖子中给出的建议,但我无法让它为我工作。但是,意图是单击按钮,转到线程,更新线程内的标签。就像我说的,我无法编译,并收到以下错误:
An object reference is required for the non-static field, method, or property 'Form1.label1'
我将非常感谢任何帮助,并为我缺乏知识而道歉,因为我认为这是完全基本的。我每天都在学习。
提前致谢
答案 0 :(得分:0)
只是为了解决您的问题:
但是,如果您总是希望定期更新UI并且在一致的时间内更好,那么更好的解决方案是使用System.Windows.Timer,它是在主UI线程上运行的计时器并且通过用它初始化它的间隔。然后你不必使用Invoke方法。
看看这里: https://msdn.microsoft.com/en-us/library/system.windows.forms.timer(v=vs.110).aspx
答案 1 :(得分:0)
处理UI线程可能很棘手。这是一个对我来说很方便的小费。将以下扩展方法添加到项目中。
public static class WindowsFormsControlExtensions
{
public static void Invoke(this Control control, Action action)
{
control.Invoke(action);
}
}
在表单类中添加方法时,可以使用扩展名,如下所示。 this
关键字将引用表单,包含代码将在包含表单句柄的线程上执行。
public void SetLabel(string text)
{
this.Invoke(() =>
{
if (label1 != null)
label1.Text = text;
});
}