Invoke存在潜在的同步问题?

时间:2015-02-24 10:55:55

标签: c# thread-safety invoke

我正在尝试从工作线程中的控件读取值。

    public void worker()
    {
        while (true)
        {
            ewh.WaitOne();

            int index = -1;
            this.Invoke((MethodInvoker)delegate()
            {
                index = this.comboBoxSource.SelectedIndex;
            });

            // using index here

据我所知,Invoke是异步启动的。我是否正确,在我使用indexInvoke完成其工作时,我无法保证?如果是这样,我如何将Invoke作为阻塞操作?

1 个答案:

答案 0 :(得分:3)

  

据我所知,Invoke是异步启动的。

不,Invoke是同步的,因为它将阻塞,直到委托在UI线程中完成。遗憾的是,Control.Invoke(Delegate)中没有明确记录这一点。另一个重载(Control.Invoke(Delegate, object[])表明它是ISynchronizeInvoke.Invoke的实现更清楚:

  

BeginInvoke不同,此方法同步运行,即在返回之前等待进程完成。呼叫期间引发的异常会传播回呼叫者。