c#(csharp)中invoke的问题,希望各位能够指点一下

chenyixin119 2011-03-17 08:35:21
public void DoGUIClear()
{
if (this.InvokeRequired)
{
GUIClear delegateMethod = new GUIClear(this.DoGUIClear);
this.Invoke(delegateMethod);
}
else
this.lstRegisterValues.Items.Clear();
}
源程序如上,我不清楚该程序段的功能,特别是if那部分。感觉是一个循环调用并等待的过程,不知道是不是这样的
...全文
593 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
人工智能算法 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fangxinggood 的回复:]
只要不在 UI 主线程上,都必须用 Control.Invoke(delegate, object)
[/Quote]

是这么回事.. 如果不想这么调用 必须设置一个值


// 获取或设置一个值,该值指示是否捕获对错误线程的调用,这些调用在调试应用程序时访问控件的 System.Windows.Forms.Control.Handle 属性。
// 返回结果:
// 如果捕获了对错误线程的调用,则为 true;否则为 false。
Control.CheckForIllegalCrossThreadCalls = false;





否则 在非创建控件的线程上调用控件的方法和属性会报异常的.


public void DoGUIClear()
{
if (this.InvokeRequired)//如果在非创建控件的线程上.
{
//生成一个委托的方法
GUIClear delegateMethod = new GUIClear(this.DoGUIClear);
//调用委托的方法. 这个调用,使用了this对象(创建控件的句柄对象)
this.Invoke(delegateMethod);//这么调用就"名正言顺"了
}
else//否则 是在创建控件的线程上执行此函数, 可以直接访问控件.
this.lstRegisterValues.Items.Clear();
}

机器人 2011-03-17
  • 打赏
  • 举报
回复
只要不在 UI 主线程上,都必须用 Control.Invoke(delegate, object)
chenyixin119 2011-03-17
  • 打赏
  • 举报
回复
如果我所用控件都是在一个线程上的,那if (this.InvokeRequired)这部分只是以防万一?
[Quote=引用 3 楼 brian6peng 的回复:]

InvokeRequired属性表示对控件的操作是否需要在创建它的线程上执行,如果需要的话就让创建控件的线程去执行,否则就在调用此方法的线程上执行。一般情况下对控件的操作只能让创建它的线程执行的。不知道我说清楚没,希望对你有帮助
[/Quote]
蜗牛的长征 2011-03-17
  • 打赏
  • 举报
回复
InvokeRequired属性表示对控件的操作是否需要在创建它的线程上执行,如果需要的话就让创建控件的线程去执行,否则就在调用此方法的线程上执行。一般情况下对控件的操作只能让创建它的线程执行的。不知道我说清楚没,希望对你有帮助
机器人 2011-03-17
  • 打赏
  • 举报
回复
if (this.InvokeRequired)

只是判断当前环境,是否需要跨线程赋值。

如果需要,则必须使用 Control.Invoke(delegate, object)
w_hair 2011-03-17
  • 打赏
  • 举报
回复
http://social.msdn.microsoft.com/Forums/zh-CN/2212/thread/4d700595-bbd8-4db4-9ae6-0d1e045fe18c/

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧