加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中的简单多线程程序无法正常工作

发布时间:2020-12-16 00:02:27 所属栏目:百科 来源:网络整理
导读:我试图用C#编写一个简单的多线程程序.它有一个按钮按下,在窗体上创建一个新标签,然后一个for循环运行显示标签中的循环值.因此,如果您按下按钮3次,它将创建3个线程,其中3个标签在带有循环的表单上. 当我按下按钮一次,它工作正常.但是当我不止一次按下它来创建
我试图用C#编写一个简单的多线程程序.它有一个按钮按下,在窗体上创建一个新标签,然后一个for循环运行显示标签中的循环值.因此,如果您按下按钮3次,它将创建3个线程,其中3个标签在带有循环的表单上.

当我按下按钮一次,它工作正常.但是当我不止一次按下它来创建更多标签时,它会遇到以下问题:

>一旦多次按下按钮,它就会停止前一个线程中的循环并运行新线程的循环.如果它是多线程的,那么它不应该停止第一次循环.
>当第二个标签的循环结束时,它会出现以下错误

Object reference not set to an instance of an object

这是我的完整代码.抛出错误的行最后是“mylabel [tcount] .Text = i.ToString();”.

程序截图:http://i.imgur.com/IFMIs.png

代码http://i.imgur.com/sIXtc.png的屏幕截图

namespace WindowsFormsApplication2{
    public partial class Form1 : Form{
        public Form1(){
            InitializeComponent();
        }

        private int tcount = 0;
        private int y_point = 0;

        Thread[] threads = new Thread[5];
        Label[] mylabel = new Label[5];

        private void button1_Click(object sender,EventArgs e){
            threads[tcount] = new Thread(new ThreadStart(work));
            threads[tcount].Start();
        }

        private void work(){
            if (this.InvokeRequired){
                this.Invoke(new MethodInvoker(delegate{
                    mylabel[tcount] = new Label();
                    mylabel[tcount].Text = "label" + tcount;
                    mylabel[tcount].Location = new System.Drawing.Point(0,y_point + 15);
                    y_point += 25;

                    this.Controls.Add(mylabel[tcount]);
                    for (int i = 0; i < 10000; i++){
                        mylabel[tcount].Text = i.ToString();
                        Application.DoEvents();
                    }
                }));
            }
            tcount++;
        }
        }
    }

解决方法

问题是tcount的范围,因为所有线程都访问它的相同实例,所以一旦第二个线程启动,第一个线程也会进入第二个标签.

你也调用你的整个worker方法,让它再次在UI-Thread中运行 – >实际上并不是多线程的……

您的worker方法应如下所示:

private void work()
{
    int tIndex = tCount; //store the index of this thread
    tcount++;
    mylabel[tIndex] = new Label();
    mylabel[tIndex].Text = "label" + tcount;
    mylabel[tIndex].Location = new System.Drawing.Point(0,y_point + 15);
    y_point += 25;

    Invoke((MethodInvoker)delegate() { this.Controls.Add(mylabel[tIndex]); });

    for (int i = 0; i < 10000; i++)
    {
        //doWork
        Invoke((MethodInvoker)delegate() { mylabel[tIndex].Text = i.ToString(); });
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读