1

我的目标是,在“Dummy”函数中,我可以更改线程启动的表单的标签等控件……怎么做……请不要提出完全不同的策略或创建工人阶级等。 ..如果可以的话,修改它

        Thread pt= new Thread(new ParameterizedThreadStart(Dummy2));


        private void button1_Click(object sender, EventArgs e)
        {                    
            pt = new Thread(new ParameterizedThreadStart(Dummy2));
            pt.IsBackground = true;
            pt.Start( this );
        }


        public static void Dummy(........)
        {
           /*                
           what i want to do here is to access the controls on my form form where the
           tread was initiated and change them directly
           */ 
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (t.IsAlive)
                label1.Text = "Running";
            else
                label1.Text = "Dead";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            pt.Abort();
        }


    }
}

我的计划是我可以在“虚拟”功能中做到这一点

Dummy( object p)
{
  p.label1.Text = " New Text " ;
}
4

3 回答 3

4

您可以这样做,假设您使用以下方法将表单的实例传递给线程t.Start(...)方法:

private void Form_Shown(object sender)
{
    Thread t = new Thread(new ParameterizedThreadStart(Dummy));
    t.Start(this);
}

....


private static void Dummy(object state)
{
    MyForm f = (MyForm)state;

    f.Invoke((MethodInvoker)delegate()
    {
        f.label1.Text = " New Text ";
    });
}

编辑
为清楚起见添加了线程启动代码。

于 2009-08-21T12:22:46.313 回答
3

你不能这样做。您只能在创建它的同一线程上访问 UI 控件。

请参阅System.Windows.Forms.Control.Invoke方法Control.InvokeRequired属性。

于 2009-08-21T12:12:18.087 回答
2

可以使用这样的东西:

private void UpdateText(string text)
{
    // Check for cross thread violation, and deal with it if necessary
    if (InvokeRequired)
    {
        Invoke(new Action<string>(UpdateText), new[] {text});
        return;
    }

    // What the update of the UI
    label.Text = text;
}

public static void Dummy(........)
{
   UpdateText("New text");
}
于 2009-08-21T12:21:41.867 回答