我想了解有关线程的更多信息,并创建了一个更改标签背景色的小测试应用程序。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//lblColor
public Color theLabel
{
get { return this.lblColor.BackColor; }
set { this.lblColor.BackColor = value; }
}
//btnStart
private void btnStart_Click(object sender, EventArgs e)
{
ThreadTest cColor = new ThreadTest();
Thread tColor = new Thread(new ThreadStart(cColor.ChangeColor));
tColor.Start();
}
}
还有……
public class ThreadTest
{
public void ChangeColor()
{
Form1 foo = new Form1();
while (true)
{
foo.theLabel = Color.Aqua;
foo.theLabel = Color.Black;
foo.theLabel = Color.DarkKhaki;
foo.theLabel = Color.Green;
}
}
}
唯一的问题是为什么我不能让这段代码工作?我可以看到 ChangeColor 中的代码运行了,但标签的颜色没有改变。
最佳答案
乍一看,你正在构建一个新的表单
Form1 foo = new Form1();
在 ThreadTest 中并且从不显示表单,我猜你是想用 btnStart 改变表单的颜色吗?您有两个选择,要么将表单传递给 ParameterizedThreadStart,要么重新编写代码以仅对现有表单进行操作。
此外,根据编写的代码,您可能需要使用 Invoke 来更新表单的状态,因为您无法让工作线程更新 UI。如果有人不反对我,我会调整您的代码并发布修改后的示例。
编辑
在这种情况下,您不需要调用...但这就是我认为您的意图...
private void btnStart_Click(object sender, EventArgs e)
{
ThreadTest cColor = new ThreadTest();
Thread tColor = new Thread(new ParameterizedThreadStart(cColor.ChangeColor));
tColor.Start(this);
}
public class ThreadTest
{
public void ChangeColor(Object state)
{
Form1 foo = (Form1) state;
while (true)
{
foo.theLabel = Color.Aqua;
foo.theLabel = Color.Black;
foo.theLabel = Color.DarkKhaki;
foo.theLabel = Color.Green;
}
}
}
此外,将工作线程设置为后台线程也很重要,否则当您关闭表单时,该线程将保持该应用程序打开。
tColor.IsBackground = true;
附加示例
一个略有不同的示例是让多个线程尝试更新相同的值并查看它们是如何交错的......简单的代码片段可以让球滚动。
private void btnStart_Click(object sender, EventArgs e)
{
CreateBackgroundColorSetter(Color.Aqua);
CreateBackgroundColorSetter(Color.Black);
CreateBackgroundColorSetter(Color.DarkKhaki);
CreateBackgroundColorSetter(Color.Green);
}
private void CreateBackgroundColorSetter(Color color)
{
var thread = new Thread(() =>
{
while (true)
{
theLabel = color;
Thread.Sleep(100);
}
});
thread.IsBackground = true;
thread.Start();
}
关于c# - 简单的线程测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4107007/