由于某种原因,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。有什么解决办法吗?