【发布时间】:2010-11-10 19:24:30
【问题描述】:
我倾向于在我的大多数应用程序底部使用 StatusStrip 来进行简单的状态更新,偶尔还会使用进度条。
但是,ToolStripStatusLabels 似乎没有从控件继承,因此它们没有 .Invoke 或 .InvokeRequired。那么我将如何进行线程安全调用来更改它的 text 属性呢?
为后代和其他搜索者提供编码答案:
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的句柄是否已创建。 -
除了尚未创建句柄之外,看起来这些情况除了抛出异常之外什么都不做,对吧?如果还没有创建句柄,我不确定假装什么都没发生而不抛出异常是否有用。
标签: .net multithreading toolstrip