BeginInvoke只会阻塞主线程,不会阻塞支线程!因此BeginInvoke的异步执行是指相对于支线程异步,而不是相对于主线程异步我想知道上面别人的结论对不对? BeginInvoke和Invoke跟阻不阻塞UI线程没关系,是相对于子线程的,前者不阻塞子线程,后者阻塞子线程(这里的子线程是指调用this.Invoke和this.BeginInvoke的线程)
.如果你大量操作UI界面,BeginInvoke和Invoke也解决不了界面卡的问题,它两只能解决跨线程访问控件的问题。 这也是别人的结论 还有人说begininvoke不会阻塞UI线程??? 要把长时间的代码放在工作线程中而非UI线程?
谁能来告诉我他们都对吗,你要是把长时间的代码放在子线程begininvoke的前面,不是执行不到begininvoke里面委托吗?
谁来整合下啊。 第一个结论是不是错的???
------解决思路----------------------
整天纠结是非的人,你会发现,往往是重复了一大堆别人的名词儿,在那里总是要求你“你说是对还是错的”,然后他就用来挑别人的最肤浅的名词儿去。
但是一旦他的任务不是抠别人的“字眼儿”,而是要求他自己做点程序设计,他就怂了,描述出来的问题就根本看不懂逻辑了。这就是因为他缺乏动手写大量测试的能力,而整天都在那里讨论是非问题。
------解决思路----------------------
既然委托注册的方法是在UI线程执行,那么它自然就会占用UI线程的执行时间。它肯定要影响到 windows 消息泵进行消息处理的及时性,例如用户操作鼠标、键盘的响应,或者是在 UI 线程触发的定时器响应代码等等。如果阻塞是指windows 消息处理被推迟,那么就可以这样说。
但是具体来说,比如说你写 Thread.Sleep(10000),这个叫做阻塞,因为它真的是基于一个阻塞消息机制处理的。但是如果计算机(假设)每一秒钟进行一次时钟中断时调用任务列表上的程序,结果因为列表上有一个程序需要超过1秒钟的时间,而造成列表上后续要调用的程序无法保证在第2秒钟准确启动,这不算是真的被阻塞,因为谁也没有调用阻塞消息机制,只是被推迟执行了。
至于说“长时间的代码放在工作线程”和“放在子线程 BeginInvoke 的前面”,这个代码是注册委托的,不是执行委托的。即时是写 Invoke(而不是 BeginInvoke)也是注册委托而不是执行委托,只不过 Invoke 需要阻塞自己执行,而 BeginInvoke 不需要阻塞自己执行而已。
在我们的程序中,从来不使用 Invoke,而仅仅使用 BeginInvoke。
这一点概念区别,对于程序设计似乎没有什么影响。只要你照着示例代码多练习就行。先写程序,然后再考虑这些概念。
------解决思路----------------------
说需求,而不要说你拍脑袋想的方案