看看这些截图。首先在我的代码中显示断点,并显示InvokeRequired的当前值。
Seconds屏幕截图显示了在调试器中按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命名&#39;&#39;
以及在 rtbOutput.Text =&#34; abc&#34;;
上抛出异常的方法无论其!如果 rtbOutput.Text =&#34; abc&#34; / em>仍然存在!
更新#2 - 解决方案:
问题是一个尚未创建的窗口句柄(我在创建窗口后立即订阅了一个事件)我必须等待使用
创建句柄this.IsHandleCreated