我正在尝试使用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;
是从线程以外的线程访问的。我想知道为什么例外?这两者有什么不同?
答案 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
中看到了这一点