WinForm(C#)中跨线程访问控件的解决方法

来源:互联网 发布:vim python插件 编辑:程序博客网 时间:2024/06/07 20:43

由于多线程可能导致对控件访问的不一致,导致出现问题。C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨线程的直接访问,在运行时会抛出异常。

解决办法有两个:

1、不进行线程安全的检查

2、通过委托的方式,在控件的线程上执行

publicpartialclassForm1:Form
   {
       publicForm1()
       {
           InitializeComponent();
           //方法一:不进行跨线程安全检查
           //System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
       }
 
       privatevoidbutton1_Click(objectsender,EventArgse)
       {
           Threadth1=newThread(newThreadStart(CalNum));
           th1.Start();
       }
 
       privatevoidCalNum()
       {
           //button1.Enabled = false;
 
           intresult=0;
           for(inti=1;i<100000000;i++)
           {
               result+=i;
           }
 
           SetCalResult(result);
 
           //button1.Enabled = true;
       }
 
       //方法二:检查是否跨线程,然后将方法加入委托,调用委托
       publicdelegatevoidSetTextHandler(intresult);
       privatevoidSetCalResult(intresult)
       {
           if(label2.InvokeRequired==true)
           {
               SetTextHandlerset=newSetTextHandler(SetCalResult);//委托的方法参数应和SetCalResult一致
               label2.Invoke(set,newobject[]{result});//此方法第二参数用于传入方法,代替形参result
           }
           else
           {
               label2.Text=result.ToString();
           }
       }
   }
转载地址:http://blog.bossma.cn/winform/winform_csharp_cross_thread_control_invoke/

0 0
原创粉丝点击