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(); }); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |