Control.InvokeRequired在整个方法中进行更改

时间:2016-09-14 11:19:45

标签: c# winforms invoke invokerequired

看看这些截图。首先在我的代码中显示断点,并显示InvokeRequired的当前值。

Step 1

Seconds屏幕截图显示了在调试器中按F10(跳过一次)后的InvokeRequired的值(未输入IF语句内容,ELSE是)。

Step 2

接下来会发生什么,是rtbOutput上的InvalidOperationException,因为我尝试在ReportProgress中更改其字段。以下是我如何调用OnProgressReported:

public event EventHandler<BuildProgressEventArgs> BuildProgresReported = delegate { };

public void InvokeReportBuildProgress(BuildProgress progress)
{
    BuildProgresReported.Invoke(this, new BuildProgressEventArgs(progress));
}

这怎么可能?还有其他更好的方法来检测是否应该调用Invoke吗?

更新

我已将方法代码更改为以下内容:

public void OnProgressReported( object caller, BuildProgressEventArgs progressEventArgs )
        {
            if( rtbOutput.InvokeRequired )
            {
                Debug.WriteLine($"Invoke was required on thread: #{Thread.CurrentThread.ManagedThreadId} named '{Thread.CurrentThread.Name}'");
                rtbOutput.BeginInvoke( new Action( () => OnProgressReported(caller, progressEventArgs) ) );
            }
            else
            {
                Debug.WriteLine($"Invoke was NOT required on thread: #{Thread.CurrentThread.ManagedThreadId} named '{Thread.CurrentThread.Name}'");
                if ( this.IsDisposed )
                {
                    throw new InvalidOperationException( "This form has been disposed" );
                }

                rtbOutput.Text = "abc";
                rtbOutput.Text = "xxx";
                //ReportProgress(progressEventArgs.Progress);
            }
        }

唯一的输出是

  

线程上不需要调用:#15命名&#39;&#39;

以及在 rtbOutput.Text =&#34; abc&#34;;

上抛出异常的方法

无论其!如果 rtbOutput.Text =&#34; abc&#34; / em>仍然存在!

更新#2 - 解决方案:

问题是一个尚未创建的窗口句柄(我在创建窗口后立即订阅了一个事件)我必须等待使用

创建句柄
this.IsHandleCreated

0 个答案:

没有答案