private void OnSearch()
        {
            searchEventHandler handler = Search;
            if (handler != null)
            {                if (handler.Target is System.ComponentModel.ISynchronizeInvoke)
                {
                    System.ComponentModel.ISynchronizeInvoke aSynch = handler.Target as System.ComponentModel.ISynchronizeInvoke;
                    if (aSynch.InvokeRequired)
                    {
                        object[] args = new object[] { this, sea };
                        aSynch.Invoke(handler, args);
                    }
                    else
                    {
                        handler(this, sea);
                    }
                }
                else
                {                    handler(this, sea);
                }
            }
            else
            {
                MessageBox.Show("事件为空!");
            }        }
下面的部分看不明白了,麻烦谁给解释下,最好别用太多的书面语,越简单越好
if (handler.Target is System.ComponentModel.ISynchronizeInvoke)
                {
                    System.ComponentModel.ISynchronizeInvoke aSynch = handler.Target as System.ComponentModel.ISynchronizeInvoke;
                    if (aSynch.InvokeRequired)
                    {
                        object[] args = new object[] { this, sea };
                        aSynch.Invoke(handler, args);
                    }

解决方案 »

  1.   

    个人理解,仅供参考:if (handler.Target is System.ComponentModel.ISynchronizeInvoke)//判断事件的目标
                    {
                        System.ComponentModel.ISynchronizeInvoke aSynch = handler.Target as System.ComponentModel.ISynchronizeInvoke;
                        if (aSynch.InvokeRequired)
                        {
                            object[] args = new object[] { this, sea };
                            aSynch.Invoke(handler, args);//采用新线程处理事件
                        }
      

  2.   


    //判断当前句柄目标是不是System.ComponentModel.ISynchronizeInvoke
    if (handler.Target is System.ComponentModel.ISynchronizeInvoke)
                    {
                        //是的话就新定义一个ISynchronizeInvoke对象,把目标赋给这个对象
                        System.ComponentModel.ISynchronizeInvoke aSynch = handler.Target as System.ComponentModel.ISynchronizeInvoke;
                        //判断这个类的InvokeRequired是否为真
                        if (aSynch.InvokeRequired)
                        {
                            为真的话就调用aSynch的Invoke方法。
                            object[] args = new object[] { this, sea };
                            aSynch.Invoke(handler, args);
                        }ISynchronizeInvoke这个类不知道是做什么用的,楼主MSDN查一下。
      

  3.   


    if (handler.Target is System.ComponentModel.ISynchronizeInvoke)
    {
      System.ComponentModel.ISynchronizeInvoke aSynch = handler.Target as System.ComponentModel.ISynchronizeInvoke; 
      if (aSynch.InvokeRequired)
      { 
        object[] args = new object[] { this, sea };
        aSynch.Invoke(handler, args);
      }handler 是一个 Delegate , 每一个 Delegate 都有一个 Target 属性,
    对应于 delegate 所在函数的类对象.调用 handler 的一方跟 handler 实现的一方, 有时并非在同一个线程中,
    所以我们在调用一个函数(handler) 之前, 
    应该先判断一下, 这个调用是否是线程安全的,
    是否可以直接调用, 还是需要将调用 marshal 到另外一个线程.而 System.ComponentModel.ISynchronizeInvoke 接口正是用于这个目的的,我详细考察了 .net 类库, 发现只有 System.Windows.Forms.Control 实现了这个接口.
    用于其他线程访问 ui 控件时做咨询工作.