繁体   English   中英

C#:Control.BeginInvoke在哪里运行?

[英]C#: Where does Control.BeginInvoke run?

该方法到底能做什么? 我以为它可能会进入一个单独的线程,但是在正确的线程上处理了诸如控件更新之类的事情。 但是现在我开始认为它可能只在UI线程上运行。 这意味着从UI调用控件上的BeginInvoke与调用Invoke几乎相同? 要么?

它基本上将委托添加到“要执行的任务”队列中。 UI线程按顺序运行这些任务。

Control.InvokeControl.BeginInvoke之间的区别基本上是Control.Invoke阻塞工作线程,直到任务在UI线程上执行为止,而BeginInvoke则没有。 我不知道随便是否有任何区别BeginInvokeInvoke ,当你从UI线程调用它。

我不是100%肯定我最后一句话。

它包含“来自UI ...”,是否表示“您从UI所在的同一线程调用BeginInvoke?” 还是“来自UI的控件”,即控件是UI的一部分?

无论如何,这两种方法最终都会在UI所在的同一线程上运行相关委托。 区别当然是Invoke会阻止,而BeginInvoke不会。 阻塞与执行调用的线程有关。

Control.BeginInvoke通常用于在创建UI的线程上更新UI / Control UI元素有一个设计约束,即只能从创建线程中进行更新。

因此,要从其他(工作人员/线程池)线程更新UI,您必须切换到正确的线程。 Control.BeginInvoke为您做到这一点-异步(因为在执行委托之前,您不会阻塞)。 调用执行相同的操作,只是在执行委托之前一直阻塞。

第一个Google结果-WinForms UI线程调用:Invoke / BeginInvoke / InvokeRequred的深入审查

请注意,如果使用Control.BeginInvoke调用返回某些内容的委托,则可以使用Control.EndInvoke访问返回的值。 如果委托尚未执行,EndInvoke将阻塞直到返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM