一个线程要调用主线程的的空间进行修改,如TextBox,ListBox等,会遇到线程调用无效问题,解决方法如下;
因为你这个控件是主线程创建的,它依附于创建窗体的主线程.因此,要在子线程去访问占资源的类型,我们需要跨线程调用.textBox4.InvokeRequire用于判断是否需要跨线程,返回True为需要跨线程,此时你需要定义一个委托类来将一个含赋值语句的方法封装起来,通过textBox4.Invoke来调用这个委托.代码如下: public delegate void SetTextHandler(string text); private void SetText(string text) { if(textBox4.InvokeRequired==true) { SetTextHandler set=new SetTextHandler(SetText);//委托的方法参数应和SetText一致 textBox4.Invoke(set,new object[]{text}); //此方法第二参数用于传入方法,代替形参text } else { textBox4.Text=text; } } 那么fun2函数可以改写成: void fun2() { str1 = long.Parse(textBox1.Text); str2 = long.Parse(textBox2.Text); lock (this) for (long i = str2; i <= str1; i--) { sum1 = sum1 + i; } SetText( sum1.ToString()); } 注意那两句 str1 = long.Parse(textBox1.Text);也需要写成委托形式,读取数据的方法和赋值的方法类型.