【问题标题】:Please i want to know what the differences between these two delegates are?请问我想知道这两位代表之间的区别是什么?
【发布时间】:2013-12-03 17:17:26
【问题描述】:

我正在尝试使用委托以 c# 形式返回组合框选定的索引。但是,当我使用下面的方法时,它可以工作。

 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; 是从线程而不是它创建的方法访问的。PLs 我想知道为什么异常?两者有什么不同?

【问题讨论】:

  • 在检查InvokeRequired之前访问dbtype.SelectedIndex
  • 我认为第一个代码行不通,因为委托没有返回任何内容(void),但是您在其中包装了一个返回 int 的方法,它怎么能工作?
  • 我以前也一样。但是,我更改后它仍然给出异常。
  • 现在,即使InvokeRequired 为真,您也可以从其他线程(最后一个 SelectedIndex)访问它。
  • 糟糕的问题标题。

标签: c# delegates


【解决方案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之后需要退出方法。

【讨论】:

  • 我不明白。你改变了什么?
  • 我也试过上面的方法,它抛出异常。但是,我找到了解决方案。
  • @NuruSalihu 是的,它也会抛出异常,因为@Dan-o 只添加了 cmets 来描述正在发生的事情和地点。而不是再次执行i = dbtype.SelectedIndex,您需要return this.Invoke(dt);
  • 是的。这就是答案。谢谢你 。我也在这里看到了正确的答案。 stackoverflow.com/questions/6320250/….
【解决方案2】:

谢谢大家的回答。我在这里看到了一个类似的代表来解决我的问题。我只需要先将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看到这个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多