线程间操作无效: 从不是创建控件...的解决办法

线程间操作无效: 从不是创建控件的线程访问它。它在VS2003里边不会出现这个问题,在VS2005VS2008版本里就会出这个问题的,主要是为了安全考虑哦,目前我知道的解决方法有两个

第一:

使用屏蔽线程间进行不安全监测的方法。

Control.CheckForIllegalCrossThreadCalls = false;

线程开始的时候加这么一句,OK,看不到错误了^_^,啥都能用了……
第二:
使用委托的方法,在05里,每个控件都有个InvokeRequired的属性~,判断一下是不是true,是的话进行Invoke操作的,完事了~

//建立个委托
private delegate string returnStrDelegate();

//搞个最简单滴取值滴方法~
      
private string returnSchool()
        
{
              
return CB_School.SelectedValue.ToString();
         }

//判断一下是不是该用Invoke~,不是就直接返回~
        
private string returnCB(returnStrDelegate myDelegate)
        
{
               
if (this.InvokeRequired)
             
{
                 
return (string)this.Invoke(myDelegate);
              }
              
else
             
{
                 
return myDelegate();
              }
         }

//别的线程里的调用哇~
string _school = returnCB(returnSchool);

 

对使用这两种方法的点评:第一种方法较为简单,但是第二种方法最为安全,主要是因为:使用第一种方法只是简单的将错误提示禁用了,仍然存在跨线程调用控件的问题。为此可能造成两个线程同时或者循环改变该控件的状态导致线程死锁。第二种使用的Invoke方法是线程同步的方法,所以执行过程是有先后顺序的,所以就不会出现那个异常了,使用过程中不会造成线程间相互调用时造成的死锁。如果线程间出现了相互调用,建议使用第二种方法来考虑线程间调用出现死锁的安全问题;如果线程间并没有出现相互调用,属于并发线程,则使用第一种方法效率更高。

注意:第二种方法是用委托将方法调用的时机进行了排序却不能达到两个方法并行运行的效果,安全是安全了却也把同步功能的效果费掉了,大家在使用时综合考虑使用哪种方法。

posted @ 2010-09-14 13:30  sms  阅读(574)  评论(0编辑  收藏  举报