出于某种原因,ToolStrip的ProgressBar和Label不会从其他线程更新。经过大量阅读后,我想出了这个,但仍然无法正常工作(但是按钮没问题,但状态栏上没有。)
public void GdmReaderMessageEvent(object sender, GdmMessagesEventArgs e)
{
Console.WriteLine(e.Message);
// error or abort
if (e.Message.StartsWith("Error:") || e.Message.StartsWith("Aborted"))
{
// cross thread crap
if (pb.GetCurrentParent().InvokeRequired)
pb.GetCurrentParent().Invoke(new MethodInvoker(delegate { pb.Visible = false; }));
if (lblStatus.GetCurrentParent().InvokeRequired)
lblStatus.GetCurrentParent().Invoke(new MethodInvoker(delegate { lblStatus.Text = e.Message; }));
btnImport.Invoke(new MethodInvoker(delegate { btnImport.Text = "Import"; }));
//lblStatus.Text = e.Message;
//btnImport.Text = "Import";
//pb.Visible = false;
}
}
编辑,现在所有功能,但这只是BGW线程的回调,我认为它已经很明显了。如果我只使用它:
lblStatus.Text = e.Message; // this is a Label inside Status
btnImport.Text = "Import"; // this is just a button on Form
pb.Visible = false; // this is a Progress Bar inside Status
将抛出交叉线程错误。这就是我使用Invoke()的原因。 现在按钮可以更新,但状态栏中的所有控件都没有。
希望现在更清楚了。
我使用.NET 3.5,VS2008,Winforms。 任何解决方案?
答案 0 :(得分:0)
好的,我找到了。 @Fixation,感谢指导我与"这个" (我的意思是表格本身)。我试图使用无效的控制调用。
此外,这篇文章很有用 unable to update progress bar with threading in C#
this.BeginInvoke((Action)(() => pb.Visible = false));
this.BeginInvoke((Action)(() => lblStatus.Text = e.Message));
非常完美,谢谢。