我偶然發現了專業庫中的一些代碼,並且不確定這是否是處理跨線程事件調用的乾淨方式。線程安全事件 - 這是一種「乾淨」的方式嗎?
以下代碼位於表單應用程序中。線程調用是從一個類本身開始一個新的線程和接收消息:
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'是一個非常糟糕的方式來解決這個問題。 –