如何对ToolStripStatusLabel进行跨线程调用?

Mas*_*low 16 .net multithreading toolstrip

我倾向于在我的大多数应用程序的底部使用StatusStrip进行简单的状态更新,偶尔也会使用进度条.

但是,看起来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;
            };
Run Code Online (Sandbox Code Playgroud)

要么

private void TestInvoker(string text)
    {
        if (this._statusStrip.InvokeRequired) 
            this._statusStrip.Invoke(
                   new MethodInvoker(() => this._lblStatus.Text = text));
        else this._lblStatus.Text = text;
    }
Run Code Online (Sandbox Code Playgroud)

Gre*_*g D 29

这是一个很好的问题!

虽然ToolStripStatusLabel不继承自控制,但含有ToolStrip!使用包含ToolStrip的Invoke来对其进行调用ToolStripStatusLabel.

这是因为ToolStrip手动处理其组件位的绘制,这与WPF管理其所有组件位的绘制的方式非常相似,而不为每个组生成单独的句柄.这是有用的,因为很容易忘记每个Control都有一个关联HANDLE,系统只有有限数量的那些,例如.

(我之前也遇到过这个问题.例如,我在侧栏中提到了另一个问题.我应该更新该文本以反映我最近的理解.)