由于某些原因,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。有解决办法吗?
发布于 2017-05-09 14:20:37
好吧,我找到了。@ for,谢谢你给我指点“这个”(我的意思是表单本身)。我试着使用无法工作的控制调用。
另外,这篇文章是有用的unable to update progress bar with threading in C#
this.BeginInvoke((Action)(() => pb.Visible = false));
this.BeginInvoke((Action)(() => lblStatus.Text = e.Message));太完美了,谢谢。
https://stackoverflow.com/questions/43870659
复制相似问题