当我从Form1调用我的方法时,C#跨线程操作异常

本文关键字:线程 异常 操作 方法 Form1 调用 我的 | 更新日期: 2023-09-27 18:29:20

这是我在Form2上使用的一个小方法,用于设置一些组件的状态。当我在加载时从Form2调用它时。工作正常,但当我从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 ...
}

当我从Form1调用我的方法时,C#跨线程操作异常

您需要在窗体的线程上调用方法调用。你可以让方法自己做,这样你就不必在调用代码中担心它:

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 = "-";
    }
}