多线程中的toolStripStatusLabel

本文关键字:toolStripStatusLabel 多线程 | 更新日期: 2023-09-27 18:10:30

我在多线程中使用toolStripStatusLabel,虽然它是另一个与toolStripStatusLabel交互的线程,但statusStrip的invokerrequirequired方法总是返回false(我也强制创建句柄)。在这个线程中,我可以访问toolStripStatusLabel(从else子句),更新它,但我的编辑无法在主UI中显示。下面是我的代码:

public void safeThreaded()
{                
    Form2 form = new Form2();
    StatusStrip ss = (StatusStrip)form.Controls["statusStrip1"];
    ToolStripStatusLabel label =   (ToolStripStatusLabel)ss.Items["toolStripStatusLabel1"];
    string text = "Written by the background thread.";
    if (!(ss.IsHandleCreated))
    {
        IntPtr handler = ss.Handle;
    }
    if (ss.InvokeRequired)
    {
        ss.Invoke(new updateTextCallback(updateText), new object[]{"Text generated on non-UI thread."});
    }
    else
    {
        // It's on the same thread, no need for Invoke
        label.Text = text + " (No Invoke)";
        MessageBox.Show(label.Text.ToString());
        ss.Refresh();
    }
}
private void updateText(string text)
{
    Form2 form = new Form2();
    StatusStrip ss = (StatusStrip)form.Controls["statusStrip1"];
    ToolStripStatusLabel label = (ToolStripStatusLabel)ss.Items["toolStripStatusLabel1"];
    label.Text = text;
}
public delegate void updateTextCallback(string text);

多线程中的toolStripStatusLabel

这是因为拥有线程是你调用safeThreaded()的任何线程-你正在创建StatusStripToolStripStatusLabel的表单,然后在同一个线程中编辑它。

如果你要在一个线程中创建表单,然后在一个单独的线程中运行safeThreaded()函数(没有在其中创建Form2),那么你应该看到InvokeRequired为真。

相关文章:
  • 没有找到相关文章