数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

ListBox1.Invoke(new SetTextCallback(SetText)) 中 INVOKE的作用-CSDN论坛

来源:互联网  责任编辑:小易  
本网有用户碰到这样的问题:ListBox1.Invoke(new SetTextCallback(SetText)) 中 INVOKE的作用-CSDN论坛,具体问题如下:

本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:

解决方案1:

只有 UI 线程可以更新 UI ,否则会抛出异常。

原理我不太懂。

解决方案2:

控件.(Begin)Invoke();
Invoke -> 立即调用UI线程
BeginInvoke -> 等空闲时候执行

如果没有 你可能会出现异常 跨线程操作

解决方案3:

一般跨线程操作的时候使用,使用UI线程执行你里面的那段逻辑。

解决方案4:

引用 1 楼 closurer 的回复:
只有 UI 线程可以更新 UI ,否则会抛出异常。

原理我不太懂。


非常感谢,但是   //  1、为什么不直接用 ListBox1.Items.Add(text) ?
                         //  2、ListBox1.Invoke 中的 Invoke 什么 作用 ?

解决方案5:

引用 2 楼 crystal_lz 的回复:
控件.(Begin)Invoke();
Invoke -> 立即调用UI线程
BeginInvoke -> 等空闲时候执行

如果没有 你可能会出现异常 跨线程操作


非常感谢,但是   //  1、为什么不直接用 ListBox1.Items.Add(text) ?
                         //  2、ListBox1.Invoke 中的 Invoke 什么 作用 ?

解决方案6:

引用 3 楼 qq_17486399 的回复:
一般跨线程操作的时候使用,使用UI线程执行你里面的那段逻辑。


非常感谢,但是   //  1、为什么不直接用 ListBox1.Items.Add(text) ?
                         //  2、ListBox1.Invoke 中的 Invoke 什么 作用 ?

解决方案7:

引用 4 楼 eisldkw 的回复:
Quote: 引用 1 楼 closurer 的回复:

只有 UI 线程可以更新 UI ,否则会抛出异常。

原理我不太懂。


非常感谢,但是   //  1、为什么不直接用 ListBox1.Items.Add(text) ?
                         //  2、ListBox1.Invoke 中的 Invoke 什么 作用 ?


差别就是交给 UI 线程去执行。

解决方案8:

1、因为触发的时间不定,取决于数据发送方,所以需要用回调
2、回调在c#里边的实现方法,就是委托

解决方案9:

引用 7 楼 closurer 的回复:
Quote: 引用 4 楼 eisldkw 的回复:

Quote: 引用 1 楼 closurer 的回复:

只有 UI 线程可以更新 UI ,否则会抛出异常。

原理我不太懂。


非常感谢,但是   //  1、为什么不直接用 ListBox1.Items.Add(text) ?
                         //  2、ListBox1.Invoke 中的 Invoke 什么 作用 ?


差别就是交给 UI 线程去执行。


很多回答没有答到要点,这个才是正解
invoke是的操作界面的代码留在界面线程执行,因为界面操作不是线程安全的,放在界面线程才能避免函数重入、死锁等问题

解决方案10:

引用 6 楼 eisldkw 的回复:
Quote: 引用 3 楼 qq_17486399 的回复:

一般跨线程操作的时候使用,使用UI线程执行你里面的那段逻辑。


非常感谢,但是   //  1、为什么不直接用 ListBox1.Items.Add(text) ?
                         //  2、ListBox1.Invoke 中的 Invoke 什么 作用 ?

就是C#所谓的委托,如果你开了一个子线程,在子线程中修改界面上的控件,这时候就需要用到

解决方案11:

你调试一下就会发现 ListBox1.Items.Add(text) 会报异常了,控件是在UI线程中执行
ListBox1.Invoke(new SetTextCallback(SetText), "启动成功 时间:" + DateTime.Now, 1);
是为了在别的线程中用委托的形式将ListBox1交给UI线程处理

解决方案12:

引用 8 楼 daixf_csdn 的回复:
1、因为触发的时间不定,取决于数据发送方,所以需要用回调
2、回调在c#里边的实现方法,就是委托


非常感谢,请问,什么是回调,他和正常的ListBox1.Items.Add(text); 这种函数直接执行的方式有什么区别

解决方案13:

引用 9 楼 caozhy 的回复:
Quote: 引用 7 楼 closurer 的回复:

Quote: 引用 4 楼 eisldkw 的回复:

Quote: 引用 1 楼 closurer 的回复:

只有 UI 线程可以更新 UI ,否则会抛出异常。

原理我不太懂。


非常感谢,但是   //  1、为什么不直接用 ListBox1.Items.Add(text) ?
                         //  2、ListBox1.Invoke 中的 Invoke 什么 作用 ?


差别就是交给 UI 线程去执行。


很多回答没有答到要点,这个才是正解
invoke是的操作界面的代码留在界面线程执行,因为界面操作不是线程安全的,放在界面线程才能避免函数重入、死锁等问题


非常感谢,你的回复中是不是打错了字,还有 (1)为什么说界面操作不是线程安全的,(2)什么是线程安全?

解决方案14:

引用 13 楼 eisldkw 的回复:
Quote: 引用 9 楼 caozhy 的回复:

Quote: 引用 7 楼 closurer 的回复:

Quote: 引用 4 楼 eisldkw 的回复:

Quote: 引用 1 楼 closurer 的回复:

只有 UI 线程可以更新 UI ,否则会抛出异常。

原理我不太懂。


非常感谢,但是   //  1、为什么不直接用 ListBox1.Items.Add(text) ?
                         //  2、ListBox1.Invoke 中的 Invoke 什么 作用 ?


差别就是交给 UI 线程去执行。


很多回答没有答到要点,这个才是正解
invoke是的操作界面的代码留在界面线程执行,因为界面操作不是线程安全的,放在界面线程才能避免函数重入、死锁等问题


非常感谢,你的回复中是不是打错了字,还有 (1)为什么说界面操作不是线程安全的,(2)什么是线程安全?


有些代码多线程执行时,会偏离原来的预期,就不是线程安全的。

比如  ListBox1.Items.Add(text)  这个操作,要是并发执行,没有个先来后到的话,ListBox1.Items 里面的顺序可能是混乱的。

解决方案15:

引用 13 楼 eisldkw 的回复:
Quote: 引用 9 楼 caozhy 的回复:

Quote: 引用 7 楼 closurer 的回复:

Quote: 引用 4 楼 eisldkw 的回复:

Quote: 引用 1 楼 closurer 的回复:

只有 UI 线程可以更新 UI ,否则会抛出异常。

原理我不太懂。


非常感谢,但是   //  1、为什么不直接用 ListBox1.Items.Add(text) ?
                         //  2、ListBox1.Invoke 中的 Invoke 什么 作用 ?


差别就是交给 UI 线程去执行。


很多回答没有答到要点,这个才是正解
invoke是的操作界面的代码留在界面线程执行,因为界面操作不是线程安全的,放在界面线程才能避免函数重入、死锁等问题


非常感谢,你的回复中是不是打错了字,还有 (1)为什么说界面操作不是线程安全的,(2)什么是线程安全?

是的->使得

线程不安全的情况有很多。举一个例子,如果一个函数会对全局变量有读写操作(比如说临时将一个变量存入全局函数,本函数执行计算,再把全局函数中的变量恢复),那么这个函数不允许重入。所谓重入就是这个函数没有执行完,另一个线程又调用了它。如果发生这种情况,那么先后两次调用可能都会出现不可预知的情况。

解决方案16:

Invoke 将一个委托注册给UI线程随后去执行,然后阻塞当前线程,直到注册的委托执行完毕了才允许当前线程继续执行。

没有必要使用 Invoke 的情况下,你应该使用 BeginInvoke。除非你知道必须使用 Invoke,否则请使用 BeginInvoke,而不是 Invoke。

解决方案17:

UI 组件实际上是 windows 系统性能杀手,windows 如果表现“慢”往往是漂亮界面使得它变慢的。所以大多数组件都异常复杂,而且也“不安全”,也就是说都容易在并发多线程时产生异常并崩溃。

所以对于 UI 组件的操作,你应该“排队”给 UI 线程去轮询调用,而不是在子线程中直接操作 UI 组件。

解决方案18:

引用 8 楼 daixf_csdn 的回复:
1、因为触发的时间不定,取决于数据发送方,所以需要用回调
2、回调在c#里边的实现方法,就是委托


非常感谢,但是,如您所说   “ 因为触发的时间不定,取决于数据发送方,所以需要用回调  ”   即使是使用该程序的人,在LISTBOX1中手工增加一条ITEM,那对于程序代码来讲也是触发时间不定的呀,这种情况下为什么直接用的是LISTBOX1.ADD 条目 方式 ,而没有用回调方式呀,请再给讲解一下。 非常感谢。

  • 本文相关:
  • 站长必读,如何真正写好一篇原创文章
  • 互联网之路细嗅蔷薇 资深站长分享掘金之道
  • 企业站的站长的工作重心究竟有哪些
  • 浅析:行业门户网站的一些盈利模式
  • 3000IP的企业网站每天订单不到30个的苦恼
  • 网站想内外兼修?先学习提高网站可用性的6大原则
  • 浅谈网页设计中的简约之美
  • 网页改版实战:日本设计师如何彻底优化旅游网站?
  • 网页改版实战!日本设计师如何彻底优化招聘网站?
  • 2015年值得关注的21个网页设计趋势
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved