在静态多线程实例中调用
本文关键字:调用 实例 多线程 静态 | 更新日期: 2023-09-27 18:31:14
我想做的是在当前表单的某个位置获取像素颜色。但是,我调用该方法的点位于单独的线程中。当我运行应用程序时,我收到一个错误:
跨线程操作无效:从 创建它的线程以外的线程。
线程代码:
Thread drawThread;
drawThread = new Thread(drawBikes);
抽签自行车代码:
public void drawBikes()
{
MessageBox.Show("Bike "+bike.color.ToString()+": "+Form1.ActiveForm.GetPixelColor(bike.location.X, bike.location.Y).ToString());
}
下面是 GetPixelColor 方法(在单独的静态类中):
public static class ControlExts
{
public static Color GetPixelColor(this Control c, int x, int y)
{
var screenCoords = c.PointToScreen(new Point(x, y));
return Win32.GetPixelColor(screenCoords.X, screenCoords.Y);
}
}
在哪里调用调用?
您需要从与 UI 交互的任何其他线程调用 Invoke。 在您的情况下,drawBikes() 正在尝试更新 UI。 试试这个:
public void drawBikes()
{
if (InvokeRequired)
{
this.Invoke(new MethodInvoker(drawBikes));
return;
}
// code below will always be on the UI thread
MessageBox.Show("Bike "+bike.color.ToString()+": "+Form1.ActiveForm.GetPixelColor(bike.location.X, bike.location.Y).ToString());
}
把你的代码放在 BeginInvoke 中
类似的东西
public static class ControlExts
{
public static Color GetPixelColor(this Control c, int x, int y)
{
this.BeginInvoke(new Action(() =>
{
var screenCoords = c.PointToScreen(new Point(x,y));
return Win32.GetPixelColor(screenCoords.X, screenCoords.Y);
}));
}
}