我偶然发现了专业库中的一些代码,并且不确定这是否是处理跨线程事件调用的干净方式。线程安全事件 - 这是一种“干净”的方式吗?
以下代码位于表单应用程序中。线程调用是从一个类本身开始一个新的线程和接收消息:
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个单独的''''''可能会更有效率。 –
库是单线程的(除了一些罕见的多线程部分),因此UI冻结。 – AllDayPiano
*“因此UI冻结”*和'Application.DoEvents'是一个非常糟糕的方式来解决这个问题。 –