我最近一直在开发一个应用程序,我想通过ToolStripProgressBar
控件中包含的StatusBar
控件在状态栏中显示另一个线程的进度。在我尝试添加此代码之前,我最初拥有更改ToolStripStatusLabel
控件文本的代码,为此我使用了带有委托的 Invoke 方法,一切正常。但是,我发现当我尝试使用ToolStripProgressBar
对状态栏的Invoke
方法的调用失败时没有通知(没有错误,没有异常,什么都没有)。从那以后我学到的是,要以这种方式使用进度条,我必须使用BackgroundWorker
控件。所以我的代码有效,但我不明白为什么我不能使用Invoke
似乎已经有效的方法。
一些有效和无效的示例:
这有效
public delegate void changeStatusMessage(String message);
public changeStatusMessage changeStatusMessageDelegate;
public void changeStatusMessageMethod(String message){
if(statusbar.InvokeRequired){
statusbar.Invoke(changeStatusMessageDelegate, new Object[] {message});
}else{
toolstripLabel.Text = message;
}
}
这没有用
public delegate void incrementProgressBar(int value);
public incrementProgressBar incrementProgressBarDelegate;
public void incrementProgressBarMethod(int value){
if(statusbar.InvokeRequired){
statusbar.Invoke(incrementProgressBarDelegate, new Object[] {value});
}else{
toolstripProgress.Increment(value);
}
}
在不起作用的示例中,该InvokeRequired
属性为 true,因此Invoke
调用了该方法,然后什么也没有发生。正如我所期望的那样,incrementProgressBarMethod
这次它会再次调用 whereInvokeRequired
是错误的,从而允许Increment
触发该方法。
我真的很想知道为什么这不起作用。正如我所说,我已经重新调整以使用 a BackgroundWorker
,我只是想要一个解释。