请问我想知道这两位代表之间的区别是什么?

时间:2013-12-03 08:41:00

标签: c# delegates

我正在尝试使用delegate以c#形式返回combox选择的索引。但是,当我使用下面的方法时,它可以工作。

 delegate void dttypeDelegate();

object searchType = Invoke(new dttypeDelegate(() =>
           {
              return dbtype.SelectedIndex;

           }));

上述方法将组合框选择的索引返回到对象搜索类型,该对象搜索类型能够以字符串的形式检索。但是,方法。

delegate int dttypeDelegate();
 private int searchType()
        {
            int i = 0; 
            if (dbtype.InvokeRequired)
            {
                dttypeDelegate dt = new dttypeDelegate(searchType);
                this.Invoke(dt);
            }
            else
            {
                i = dbtype.SelectedIndex; 
            }


          i = dbtype.SelectedIndex; 

           return i;

        }

引发一个例外,因为dbtype.SelectedIndex;是从线程以外的线程访问的。我想知道为什么例外?这两者有什么不同?

2 个答案:

答案 0 :(得分:1)

private int searchType()
        {
            int i = 0; 
            if (dbtype.InvokeRequired)
            {
                dttypeDelegate dt = new dttypeDelegate(searchType);
                this.Invoke(dt);   // <--- marshal to UI thread
            }
            else
            {
                i = dbtype.SelectedIndex; 
            }


          i = dbtype.SelectedIndex; // <--- now we're back on the non-UI thread.

           return i;
        }

您需要在Invoke

之后退出该方法

答案 1 :(得分:0)

谢谢大家的答案。我在这里看到一个类似的代表来解决我的问题。我只需要先将this.Invoke(dt);传递给我,或者只是将其作为返回值返回。

  private int searchType()
        {
            int i = 0;
            if (dbtype.InvokeRequired)
            {

                dttypeDelegate dt = new dttypeDelegate(searchType);
                i = (int)this.Invoke(dt);
                return i;
            }
            else
            {
               return i = dbtype.SelectedIndex; 
            }



        }

我在here

中看到了这一点