看看这些截图。首先在我的代码中显示一个断点并显示 InvokeRequired 的当前值。
秒屏幕截图显示在调试器中按 F10(跳过)一次后 InvokeRequired 的值(不输入 IF 语句内容,ELSE 是)。
接下来发生的是 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