线程间调用无效(跨线程调用问题)

    技术2022-05-20  48

    一个线程要调用主线程的的空间进行修改,如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);也需要写成委托形式,读取数据的方法和赋值的方法类型.


    最新回复(0)