繁体   English   中英

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

[英]Threading and Objects in C# not working

 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有2个标签,分别调用函数X和Y,在这些函数中,标签的文本反复递增1。 但是,我想同时进行。 当我尝试使用FuncX制作线程时,它说它无法访问在另一个线程中创建的对象并崩溃。 我使用了lock(){}语句,但是没有用。 如何在线程内更改标签的文本?

编辑:更新了代码,这是Visual Studio 2008中的Windows窗体。在带有FuncX的线程中添加计时器会导致FuncY首先执行,然后执行FuncX的线程。

您的问题有两个方面:

1-不应在不首先锁定线程的情况下在线程之间共享控件或变量。 从技术上讲,您当时处于种族场景中,这可能会造成严重破坏。

2-标签是在主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));

希望这对您有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM