我正在尝试从工作线程中的控件读取值。
public void worker()
{
while (true)
{
ewh.WaitOne();
int index = -1;
this.Invoke((MethodInvoker)delegate()
{
index = this.comboBoxSource.SelectedIndex;
});
// using index here
据我所知,Invoke是异步启动的。我是否正确,在我使用index
它Invoke
完成其工作时,我无法保证?如果是这样,我如何将Invoke作为阻塞操作?
答案 0 :(得分:3)
据我所知,Invoke是异步启动的。
不,Invoke
是同步的,因为它将阻塞,直到委托在UI线程中完成。遗憾的是,Control.Invoke(Delegate)
中没有明确记录这一点。另一个重载(Control.Invoke(Delegate, object[])
表明它是ISynchronizeInvoke.Invoke
的实现更清楚:
与
BeginInvoke
不同,此方法同步运行,即在返回之前等待进程完成。呼叫期间引发的异常会传播回呼叫者。