C#中的简单多线程程序无法正常工作
发布时间:2020-12-16 00:02:27  所属栏目:百科  来源:网络整理 
            导读:我试图用C#编写一个简单的多线程程序.它有一个按钮按下,在窗体上创建一个新标签,然后一个for循环运行显示标签中的循环值.因此,如果您按下按钮3次,它将创建3个线程,其中3个标签在带有循环的表单上. 当我按下按钮一次,它工作正常.但是当我不止一次按下它来创建
                
                
                
            | 
                         
 我试图用C#编写一个简单的多线程程序.它有一个按钮按下,在窗体上创建一个新标签,然后一个for循环运行显示标签中的循环值.因此,如果您按下按钮3次,它将创建3个线程,其中3个标签在带有循环的表单上. 
  
  
当我按下按钮一次,它工作正常.但是当我不止一次按下它来创建更多标签时,它会遇到以下问题: >一旦多次按下按钮,它就会停止前一个线程中的循环并运行新线程的循环.如果它是多线程的,那么它不应该停止第一次循环. 
 这是我的完整代码.抛出错误的行最后是“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(); });
    }
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
