我在专业库的一些代码中遇到了一些问题,不确定这是否是处理跨线程事件调用的有效方式。
下面的代码位于一个窗体应用程序中。线程调用是从一个类中进行的,该类本身启动一个新线程并接收消息:
private void Library_StatusChanged(object sender, AbstractTestCase.StatusChangedEventArgs e)
{
if (this.InvokeRequired)
{
this.lblProgress.Invoke((MethodInvoker)delegate ()
{
lblProgress.Text = "Current state: " + e.Step;
lblProgress.Refresh();
}
);
this.pbProgess.Invoke((MethodInvoker)delegate ()
{
pbProgess.Value = e.Percentage;
pbProgess.Refresh();
});
this.lstStatus.Invoke((MethodInvoker)delegate ()
{
lstStatus.Items.Add(" " + e.Step);
lstStatus.Refresh();
});
this.Invoke((MethodInvoker)delegate ()
{
this.Refresh();
});
}
else
{
lblProgress.Text = "Current state:" + e.Step;
lblProgress.Refresh();
pbProgess.Value = e.Percentage;
pbProgess.Refresh();
lstStatus.Items.Add(" " + e.Step);
lstStatus.Refresh();
this.Refresh();
}
Application.DoEvents();
}
这算是“尖端技术”吗?在我看来有点凌乱啊?!
Application.DoEvents
是某些问题的信号。而且只使用一个Invoke
可能会更有效率,而不是分别使用 4 个。 - Matt BurlandApplication.DoEvents
是一种非常糟糕的方法来掩盖这个问题。 - Matt Burland