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的线程。

c#中的线程和对象不起作用

你的问题是双重的:

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));

希望这对你有帮助!