我正在学习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);
}
}
}
}
答案 0 :(得分:6)
您只能从创建控件的线程更新控件。控件确实有一个Invoke
方法,您可以从另一个线程调用。此方法接受一个委托,指定您要在控件的线程上执行的工作:
var updateAction = new Action(() => { pictureBox1.Location = new Point(x,y); });
pictureBox1.Invoke(updateAction);
答案 1 :(得分:4)
你必须Invoke它。由于[显而易见]原因,您无法访问由其他线程创建的控件,因此您必须使用委托。几个类似的SO问题:
如果您查看第一个链接,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
});