c# invoke

csdn小码农 2016-03-16 10:42:15
第一种Invoke: Action<string> ac = new Action<string>(x => { lable.Text = x; }); ac.Invoke(s); 第二种Invoke: if (this.InvokeRequired) { Action<string> ac = new Action<string>(x => { lable.Text = x; }); ac.Invoke(s); this.Invoke(ac,x) } else { lable.Text = s; } 两个傻傻分不清,求告知
...全文
220 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lccleo 2016-03-22
  • 打赏
  • 举报
回复
第一个是一般invoke的方法 第二个是 control.invoke 其实还有begininvoke endinvoke 之类的 主要是为了跨线程调用控件 比如你在辅助线程 线程运算的同时 想把数据显示到窗体上 因为窗体和他所包含的所有的空间都属于 窗体线程 所以如此跨线程调用时不安全的 是不允许的 程序基本都会报错 这时候invoke调用 就不会报错了
csdn小码农 2016-03-21
  • 打赏
  • 举报
回复
引用 2楼tcmakebest 的回复:
InvokeRequired 只有在线程中运行时为 true, 用来判断并防止在线程中操作控件,因为会产生异常. 楼主的第二种写法中, 应该删除 ac.Invoke(s); 委托 ac.Invoke 是普通的运行方法 窗体 this.Invoke 是将要运行的方法发送到主线程运行,这样可以操作控件.
但有时候在线程中,用第一种方法也可实现访问ui线程控件呢?
csdn小码农 2016-03-21
  • 打赏
  • 举报
回复
引用 2楼tcmakebest 的回复:
InvokeRequired 只有在线程中运行时为 true, 用来判断并防止在线程中操作控件,因为会产生异常. 楼主的第二种写法中, 应该删除 ac.Invoke(s); 委托 ac.Invoke 是普通的运行方法 窗体 this.Invoke 是将要运行的方法发送到主线程运行,这样可以操作控件.
嗯嗯,复制多了,手写的代码。明白了。谢谢
tcmakebest 2016-03-17
  • 打赏
  • 举报
回复
InvokeRequired 只有在线程中运行时为 true, 用来判断并防止在线程中操作控件,因为会产生异常. 楼主的第二种写法中, 应该删除 ac.Invoke(s); 委托 ac.Invoke 是普通的运行方法 窗体 this.Invoke 是将要运行的方法发送到主线程运行,这样可以操作控件.
threenewbee 2016-03-16
  • 打赏
  • 举报
回复
this.Invoke是Control在UI线程调用委托 ac.Invoke(s);这个是调用委托 两个隶属不同的类,虽然函数名一样,但是完全是两回事。

110,534

社区成员

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

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

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