问题描述
一个多线程的程序.是在form1里面生成前50个质数的题,发现在VS2005里面运行出错,提示错误:跨线程调用windows窗体控件.但是把代码复制到VS2003上运行就没有这个错误,请问是为什么?需要修改什么?代码如下.谢谢各位了,小弟初学c#namespaceThreadDemo{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}publicvoidGenerate(){boolIsPrime=true;intcount=2;lstPrime.Items.Add(2);for(inti=0;count<50;i+=2){IsPrime=true;for(intj=2;j<=(i/2);j++){if(i%j==0){IsPrime=false;break;}}if(IsPrime){lstPrime.Items.Add(i);count++;Thread.Sleep(100);}}btnStart.Enabled=true;btnPause.Enabled=false;btnStop.Enabled=false;btnResume.Enabled=false;}privateThreadprimeThread;privatevoidbtnStart_Click(objectsender,EventArgse){primeThread=newThread(newThreadStart(Generate));primeThread.Name="质数";btnPause.Enabled=true;btnStart.Enabled=false;btnStop.Enabled=true;primeThread.Start();}privatevoidbtnStop_Click(objectsender,EventArgse){primeThread.Abort();}}}
解决方案
解决方案二:
调用控件的线程和控件UI所在的线程不是同一个线程时就会这样.这种时候应该使用控件的Invoke方法.
解决方案三:
多线程异步操作时,在辅助线程调用的工作方法上不应调用任何在主线程创建的UI控件,这是一条原则。
解决方案四:
改成这样(其它窗体操作类似)if(lstPrime.InvokeRequired)lstPrime.BeginInvoke(newEventHandler(添加),i);//i即为"添加"的s,无参数可不填void添加(objects,EventArgse){lstPrime.Items.Add(s);}
解决方案五:
LS都对,用BeginInvoke或Invoke回到UI线程上
解决方案六:
谢谢大家,请问怎么加分啊。....