当前位置: 代码迷 >> C# >> 子线程中调用this.begininvoke会不会堵塞主线程
  详细解决方案

子线程中调用this.begininvoke会不会堵塞主线程

热度:355   发布时间:2016-05-05 05:22:36.0
子线程中调用this.begininvoke会不会阻塞主线程
BeginInvoke只会阻塞主线程,不会阻塞支线程!因此BeginInvoke的异步执行是指相对于支线程异步,而不是相对于主线程异步我想知道上面别人的结论对不对?     BeginInvoke和Invoke跟阻不阻塞UI线程没关系,是相对于子线程的,前者不阻塞子线程,后者阻塞子线程(这里的子线程是指调用this.Invoke和this.BeginInvoke的线程)
.如果你大量操作UI界面,BeginInvoke和Invoke也解决不了界面卡的问题,它两只能解决跨线程访问控件的问题。
    这也是别人的结论                         还有人说begininvoke不会阻塞UI线程???     要把长时间的代码放在工作线程中而非UI线程?

 谁能来告诉我他们都对吗,你要是把长时间的代码放在子线程begininvoke的前面,不是执行不到begininvoke里面委托吗? 

谁来整合下啊。   第一个结论是不是错的???                 
------解决思路----------------------
整天纠结是非的人,你会发现,往往是重复了一大堆别人的名词儿,在那里总是要求你“你说是对还是错的”,然后他就用来挑别人的最肤浅的名词儿去。

但是一旦他的任务不是抠别人的“字眼儿”,而是要求他自己做点程序设计,他就怂了,描述出来的问题就根本看不懂逻辑了。这就是因为他缺乏动手写大量测试的能力,而整天都在那里讨论是非问题。
------解决思路----------------------
引用:
还有人说begininvoke不会阻塞UI线程???     要把长时间的代码放在工作线程中而非UI线程?

 谁能来告诉我他们都对吗,你要是把长时间的代码放在子线程begininvoke的前面,不是执行不到begininvoke里面委托吗? 


既然委托注册的方法是在UI线程执行,那么它自然就会占用UI线程的执行时间。它肯定要影响到 windows 消息泵进行消息处理的及时性,例如用户操作鼠标、键盘的响应,或者是在 UI 线程触发的定时器响应代码等等。如果阻塞是指windows 消息处理被推迟,那么就可以这样说。

但是具体来说,比如说你写 Thread.Sleep(10000),这个叫做阻塞,因为它真的是基于一个阻塞消息机制处理的。但是如果计算机(假设)每一秒钟进行一次时钟中断时调用任务列表上的程序,结果因为列表上有一个程序需要超过1秒钟的时间,而造成列表上后续要调用的程序无法保证在第2秒钟准确启动,这不算是真的被阻塞,因为谁也没有调用阻塞消息机制,只是被推迟执行了。

至于说“长时间的代码放在工作线程”和“放在子线程 BeginInvoke 的前面”,这个代码是注册委托的,不是执行委托的。即时是写 Invoke(而不是 BeginInvoke)也是注册委托而不是执行委托,只不过 Invoke 需要阻塞自己执行,而 BeginInvoke 不需要阻塞自己执行而已。

在我们的程序中,从来不使用 Invoke,而仅仅使用 BeginInvoke。

这一点概念区别,对于程序设计似乎没有什么影响。只要你照着示例代码多练习就行。先写程序,然后再考虑这些概念。
------解决思路----------------------
说需求,而不要说你拍脑袋想的方案