从线程C#更改表单属性

时间:2018-09-27 20:54:03

标签: c#

你好,我想用一个线程更改从form1创建的form2的位置,在另一个带有struct的form2中创建的线程中

编辑: 我发表了另一篇文章

还有另一个问题, 如何使Form2停止思考?

这是一个类似的代码,可以使其保持简单。 加载Form1后,将创建一个线程,该线程将运行其中具有无限循环的方法,并有时创建Form2并继续循环,问题是Form2永不停止思考。

public partial class Form1 : Form
{//Form1
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Thread childThread = new Thread(new ThreadStart(loop);
        childThread.Start();
    }





    public void loop()
        {
            int i = 0;
            while (true)
            {
                if (i == 45)
                {
                    Form2 f = new Form2();
                    f.Show();
                }
                i = i + 1;
            }
        }        

    }
}
public partial class Form2 : Form
{//Form2
    public Form2()
    {
        InitializeComponent();
    }
    public struct Rect
    {
        public int Left { get; set; }
        public int Top { get; set; }
        public int Right { get; set; }
        public int Bottom { get; set; }
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        Thread childThread = new Thread(new ThreadStart(method));
        childThread.Start();
    }
    public void method()
    {
        Rect move = new Rect();
        move.Left = 100;
        move.Top = 100;
        this.Invoke(new MethodInvoker(() => { mover(move); }));
    }
    public void mover(Rect move)
    {
        this.Left = move.Left;
        this.Top = move.Top;
    }
}

1 个答案:

答案 0 :(得分:0)

您应该创建一个方法

void SetLeft(int left)
{
   this.Left = left;
}

您可以从任何线程调用它:

if (this.InvokeRequired) {
    this.Invoke(new MethodInvoker(() => { SetLeft(10); } );
} else {
    SetLeft(10);
}