3

我正在学习 C# 中的线程,所以我的第一个程序将是 2 个会移动的图像。但问题是当我尝试在线程中执行新点时出现错误:

这是我的代码:

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

        int x = 0;
        int y = 0;

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

        public void Hilo1()
        {   
            while (true) 
            {
                x = pictureBox1.Location.X - 1;
                y = pictureBox1.Location.Y;
                pictureBox1.Location = new Point(x, y);
            }   
        }
    }
}
4

2 回答 2

6

您只能从创建控件的线程更新控件。控件确实有一个Invoke可以从另一个线程调用的方法。此方法接受一个委托,该委托指定您希望在控件线程上执行的工作:

var updateAction = new Action(() => { pictureBox1.Location = new Point(x,y); });
pictureBox1.Invoke(updateAction);
于 2012-10-07T04:36:31.083 回答
4

你必须调用它。由于 [明显] 原因,您无法访问由不同线程创建的控件,因此您必须使用委托。几个类似的SO问题:

  1. 如何从 C# 中的另一个线程更新 GUI?111 票
  2. 使用两个线程写入文本框
  3. 如何从 C# 中的另一个线程更新 GUI 上的文本框
  4. 从另一个线程写入文本框?

如果您查看第一个链接,Ian 的出色答案将演示您应该如何在 .Net 2.0 和 3.0 中执行此操作。或者您可以向下滚动到下一个答案 Marc's,它将向您展示如何以最简单的方式进行操作。

代码:

//worker thread
Point newPoint = new Point(someX, someY);
this.Invoke((MethodInvoker)delegate {
pictureBox1.Location = newPoint;
// runs on UI thread
});
于 2012-10-07T04:45:39.517 回答