这种方法究竟做了什么?我在想它可能会进入一个单独的线程,但是在正确的线程上处理控制更新等事情。但现在我开始认为它可能只是在UI线程上运行。这意味着从UI调用控件上的BeginInvoke与调用Invoke几乎相同?或?
答案 0 :(得分:5)
它基本上将委托添加到“要执行的任务”的队列中。 UI线程按顺序运行这些任务。
Control.Invoke
和Control.BeginInvoke
之间的区别基本上是Control.Invoke
阻止工作线程,直到任务在UI线程上执行,而BeginInvoke
则不然。当您从UI线程调用它时,我不确定 offhand BeginInvoke
和Invoke
之间是否存在任何差异。
答案 1 :(得分:0)
我不是100%肯定我得到了最后一句话。
它包含“来自UI ...”,这是否意味着“你从UI所在的同一个线程调用BeginInvoke?”或者“来自UI的控件”,即作为UI的一部分的控件?
无论如何,这两种方法都会在UI所在的同一个线程上运行有问题的委托。区别当然是Invoke块,而BeginInvoke则不然。阻塞与执行调用的线程有关。
答案 2 :(得分:0)
Control.BeginInvoke通常用于更新创建UI的线程上的UI / Control 。 UI元素具有设计约束,只能从创建线程更新它们。
因此,要从不同的(工作者/线程池)线程更新UI,您必须切换到正确的线程。 Control.BeginInvoke为您执行此操作 - 异步(在您执行委托之前不会阻塞)。调用执行相同的操作,除非您阻止代理执行。
答案 3 :(得分:0)
请注意,如果使用Control.BeginInvoke调用返回某些内容的委托,则可以使用Control.EndInvoke访问返回的值。如果委托尚未执行,则EndInvoke将阻塞,直到它返回。