我傾向於在大多數應用程序的底部使用StatusStrip進行簡單的狀態更新,偶爾還會使用進度條。如何對ToolStripStatusLabel進行跨線程調用?
但是,它似乎ToolStripStatusLabels不從控件繼承,所以它們沒有.Invoke或.InvokeRequired。那麼,我將如何線程安全地撥打電話來更改它的文本屬性?
爲後人編碼的答案和其他人前來尋找:
Action<string> test=(text) =>
{
if (this._statusStrip.InvokeRequired) this._statusStrip.Invoke(
new MethodInvoker(() => this._lblStatus.Text = text));
else this._lblStatus.Text = text;
};
或
private void TestInvoker(string text)
{
if (this._statusStrip.InvokeRequired)
this._statusStrip.Invoke(
new MethodInvoker(() => this._lblStatus.Text = text));
else this._lblStatus.Text = text;
}
@Maslow:在周圍Control.Invoke你的邏輯小心。如果不仔細閱讀,文檔中規定的規則是微妙的,容易出錯。請檢查我在答案中的鏈接中的代碼,以便更妥善保護使用Invoke。例如,你的實現不驗證'ToolStrip`沒有被處理,也沒有驗證'ToolStrip`的句柄已經被創建。 – 2009-07-15 01:29:11
除了尚未創建的句柄之外,看起來這些情況除了拋出異常(如果它們出現的話)之外什麼也不做,對吧?如果句柄還沒有創建,我不確定假裝什麼都沒有發生,並且不會拋出異常是有用的。 – Maslow 2009-07-15 12:57:12