![](/img/trans.png)
[英]Thread exception error in C# :Cross-thread operation not valid: Control 'lblp4' accessed from a Cross-thread operation not valid
[英]C# cross thread operation exception when I call my method from Form1
这是我在Form2上设置一些组件状态的一种小方法。 当我从Form2在Load ofofc上调用它时。 工作正常,但当我从Form1调用它(需要更新一些状态)时,我得到一个例外:
System.Windows.Forms.dll中发生了未处理的“System.InvalidOperationException”类型异常
附加信息:跨线程操作无效:从创建该线程的线程之外的线程访问控件“ button1”。
public void SetleMotor1()
{
button1.Enabled = true;
button2.Enabled = false;
if (Form1.Motor1.Calibstate == 3)
label4.Text = "Befejezve";
else
label5.Text = "Megállt";
if (Form1.Motor1.Calibrated)
{
label21.Text = "Igen";
label6.Text = Convert.ToString(Form1.Motor1.MMImp);
}
else
{
label21.Text = "Nem";
label6.Text = "-";
}
}
拜托,我在这里想念什么?
下面是Form1中调用Form2上的方法的代码:
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// reading the data etc etc etc...then evaluating:
case 1:
if ((data[1] == 40) && (Motor1.Calibstate == 3))
{
long impulses = (65536 * data[2] + 256 * data[3] + data[4]);
Form2.SetleMotor1(); // <----- this is where it happens
Motor1.Calibstate = 0;
zaloguj("A Motor 1 kalibrációja befejezve");
if (Motor1.Debug)
zaloguj("A Motor 1 köre " + Convert.ToString(impulses) + " impulzus");
Motor1.MMImp = Convert.ToInt32(impulses / 360);
Motor1.Calibrated = true;
if (Motor1.Debug)
zaloguj("M1Imp/deg: " + Convert.ToString(Motor1.MMImp));
}
break;
// other similar code ...
}
您需要在表单的线程上调用方法调用。 您可以让方法自行完成,这样您就不必在调用代码中担心它:
public void SetleMotor1()
{
if (Form1.InvokeRequired)
{
Form1.Invoke(new Action(SetleMotor1));
return;
}
button1.Enabled = true;
button2.Enabled = false;
if (Form1.Motor1.Calibstate == 3)
label4.Text = "Befejezve";
else
label5.Text = "Megállt";
if (Form1.Motor1.Calibrated)
{
label21.Text = "Igen";
label6.Text = Convert.ToString(Form1.Motor1.MMImp);
}
else
{
label21.Text = "Nem";
label6.Text = "-";
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.