ListBox1.Invoke(new SetTextCallback(SetText)) 中 INVOKE的作用

来源:互联网  责任编辑:小易  时间:2017/5/24 17:49:28
本网有用户碰到这样的问题:ListBox1.Invoke(new SetTextCallback(SetText)) 中 INVOKE的作用,具体问题如下:

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

=================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 © 2015 www.zgxue.com All Rights Reserved