Operación de subprocesos múltiples en C #: la operación entre subprocesos no es válida y el subproceso que no creó el control nunca accede a ella

La operación del objeto UI debe realizarse en el hilo que genera el objeto UI

La clase Form tiene un atributo de tipo bool InvokeRequired , que se puede usar para verificar si el subproceso actual es el subproceso que creó el objeto de formulario (subproceso de interfaz de usuario); si es verdadero, significa que el subproceso actual no es un subproceso de interfaz de usuario, de lo contrario lo es.

Hay dos métodos a los que hay que prestar atención en TestForm, UIThread, utilizado para simular el hilo de la interfaz de usuario, WorkerThread, utilizado para simular el hilo del usuario, los miembros form1 y form2 se instancian en UIThread, y se llama a su método Show, que cambia en WorkerThread La propiedad Text de form1.
Cuando ejecuto el código que se muestra a continuación, la siguiente ventana se mostrará normalmente:
Inserte la descripción de la imagen aquí
Descripción del programa:
(1) La ventana principal TestForm es el formulario de inicio, y luego dos nuevos formularios de instancia form1 y form2
(2) Code form2.Show ( ); Muestra el formulario 2
(3) Cuando se ejecuta otro método WorkerThread en el subproceso UIThread (subproceso de IU de simulación), el subproceso actual (WorkerThread) no es el subproceso que creó el formulario2 (UIThread), el método se pasa a través del método Invoke Póngalo en el hilo de la interfaz de usuario para ejecutarlo. En este momento, el valor de InvokeRequired es verdadero (lo que indica que el hilo actual no es un hilo de la interfaz de usuario). Cambie el atributo de texto de form1 a través del método Invoke y finalmente muestre 3 ventanas

Sin embargo, al comentar form2.Show ();:

Error: la operación entre subprocesos no es válida y el subproceso que creó el control nunca accede a ella

Nota:
tanto form1 como form2 se crean en UIThread, por lo que la información de hilo que contienen debe ser la misma. Entonces, los valores de form1.InvokeRquired y form2.InvokeRquired son los mismos en cualquier hilo, es decir, el valor de InvokeRquire en WorkerThread debe ser verdadero (porque en diferentes hilos),
pero si comenta form2.Show () El método show de form2 no se usa en el subproceso UIThread (subproceso de IU simulado). Cuando se ejecuta el subproceso de usuario simulado, form2.InvokeRquired es falso para que se opere directamente en el subproceso de usuario (cambie el atributo de form1 en el subproceso de IU), El método de invocación no se utiliza, por lo que se informará un error

Inserte la descripción de la imagen aquí

Código de formulario de TestForm

private Form form1;
private Form form2;      
public void UIThread()
{
    form1 = new Form();
    form2 = new Form();
    form2.Show();//注意这个地方!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    form2.Text = "form2";
    form1.Show();
    form1.Text = "form1";
    Thread thread = new Thread(new ThreadStart(WorkerThread));
    thread.Start();
}
//模拟用户线程,改变form1的text属性
public void WorkerThread()
{
    try
    {
        if (form2.InvokeRequired)
            form2.Invoke(new MethodInvoker(WorkerThread));
        else
            form1.Text = "This is from WorkerThread.";
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message,"错误提示");
    }
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    base.OnClosing(e);
    Application.Exit();

Código Program.cs

 static void Main()
{
    TestForm tf = new TestForm();
    tf.Show();
    tf.UIThread();
    Application.Run();
}

Publicación de blog de referencia:
https://blog.csdn.net/beelinkerlidejun/article/details/4772491

Publicado 18 artículos originales · elogiado 0 · visitas 233

Supongo que te gusta

Origin blog.csdn.net/qq_39217004/article/details/105488747
Recomendado
Clasificación