0

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

步骤1

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

第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 名为 ''

并且该方法在rtbOutput.Text = "abc";行上引发异常

然而!当行rtbOutput.Text = "xxx"; 被注释掉,一切正常,即使rtbOutput.Text = "abc"; 仍然存在!

更新 #2 - 解决方案:

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

this.IsHandleCreated
4

0 回答 0