c#中的线程和对象不起作用
本文关键字:对象 不起作用 线程 | 更新日期: 2023-09-27 18:02:26
private void btnCount_Click(object sender, EventArgs e)
{
Thread thread = new Thread(FuncX);
thread.Start();
FuncY();
}
public void FuncX()
{
this.Invoke(new MethodInvoker(delegate
{
//put UI thread code here.
//you can assign local variables values from the main thread in here as well. They are both accessible.
lblThreadDisplayX.Text = "0";
int x = Convert.ToInt32(lblThreadDisplayX.Text);
for (int j = 0; j < loopTime; j++)
{
x++;
lblThreadDisplayX.Text = x.ToString();
Thread.Sleep(5);
Update();
}
}));
}
public void FuncY()
{
lblThreadDisplayY.Text = "0";
int y = Convert.ToInt32(lblThreadDisplayY.Text);
for (int i = 0; i < loopTime; i++)
{
y++;
lblThreadDisplayY.Text = y.ToString();
Thread.Sleep(5);
Update();
}
}
}
}
上面是我为一个测试器编写的代码,我正在努力使线程工作。有两个标签,X和Y,它们调用函数X和Y,在这些函数中,标签的文本被重复地加1。然而,我想同时做这件事。当我尝试从FuncX创建一个线程时,它说它无法访问在另一个线程中创建的对象并崩溃。我用了lock(){}
的表述,但是行不通。我能做些什么来改变一个线程内的标签的文本?
编辑:更新了代码,这是在Visual Studio 2008中的Windows窗体。在包含FuncX的线程中添加Timer会导致首先执行FuncY,然后执行FuncX的线程。
你的问题是双重的:
1-不应该在线程之间共享控件或变量,而不是先锁定它们。从技术上讲,此时你处于Race Scenario中,这可能会造成严重破坏。
2-标签是在Main UI线程上创建的。为了从线程中访问它们,你必须调用主线程来获取它,从子线程中…这又一次绕过了线程的整个要点,因为你也在使用标签来"全局存储你的变量"。
但是如果你必须这样做,下面是如何在线程中访问标签的方法:
从线程内执行代码或访问元素:
this.Invoke(new MethodInvoker(delegate
{
//put UI thread code here.
//you can assign local variables values from the main thread in here as well. They are both accessible.
}));
只提取对象的值或对象的属性(我在这里为您插入了占位符,此调用不是字面调用,您必须根据您的需要进行调整):
TypeName yourvar = (TypeName)this.Invoke(new Func<TypeName>(() => UICode here as TypeName));
希望这对你有帮助!