Ignorar errores de acceso entre hilos CheckForIllegalCrossThreadCalls = false

CheckForIllegalCrossThreadCalls = false

Permitir acceso entre hilos, pero esto es inestable, usar con precaución

Configure la siguiente interfaz, haga clic en "button1", cambie el valor de la etiqueta, cambie el valor de la etiqueta configurando un subproceso para iniciar el método de ejecución del subproceso para cambiar, cuando la función de evento de clic del botón no agrega CheckForIllegalCrossThreadCalls = false , El acceso entre subprocesos no está permitido de forma predeterminada, y se solicitará la captura de excepciones: la
operación entre subprocesos no es válida: nunca acceda por el subproceso que creó la etiqueta de control.
El hilo que crea la etiqueta de control es el hilo principal que inicia la página, y cambio el valor de la etiqueta para acceder a él a través de otro hilo que creé, es decir, la operación de hilos cruzados. El sistema no permite que esto se haga
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
en el evento de clic del botón. Cuando la oración es Form1.CheckForIllegalCrossThreadCalls = false; descubrió que el valor de la etiqueta ha cambiado, el sistema también permite el acceso de hilos cruzados a la etiqueta
Inserte la descripción de la imagen aquí

Dé un ejemplo de inestabilidad de verificación:

Incluso si agregué Form1.CheckForIllegalCrossThreadCalls = false, pero cuando llamo al hilo creado por mí mismo dos veces bajo el evento de clic del botón, el problema ocurre, el sistema no indica que el acceso cruzado no está permitido, pero cambié Cuando se muestra el valor de la etiqueta,
se solicita el siguiente error, es decir, el error de hilos cruzados es ignorado por el valor de CheckForIllegalCrossThreadCalls, pero esta vez se detectará una excepción. En
Inserte la descripción de la imagen aquí
resumen: no se recomienda el uso excesivo para permitir el acceso de hilos cruzados. El siguiente código adicional El método invoke resuelve este problema, consulte la siguiente publicación de blog

// 通过CheckForIllegalCrossThreadCalls的值忽略跨线程错误,这时会抛出异常 
 private void button1_Click(object sender, EventArgs e)
 {
       Form1.CheckForIllegalCrossThreadCalls = false;//允许跨线程访问
        //第一次调用
        btn1 = new Thread(new ThreadStart(doThread));
        btn1.IsBackground = true;
        btn1.Start();
        Thread.Sleep(50);
       //第二次调用
     //  btn1 = new Thread(new ThreadStart(doThread));
     //  btn1.IsBackground = true;
     //  btn1.Start();
 }
 // 不使用invoke方法直接进入Control 
 void doThread()
 {
     for (int i = 0; i < 100; i++)
     {
         test();
         Thread.Sleep(10);
     }
 }
 // 模拟一个实际应用
 // 对label1赋值后立马检查他的值,如果已经被改过则抛出异常 
 void test()
 {
     try
     {
         string strText = Guid.NewGuid().ToString();//随机生成一串字符
         this.label1.Text = strText;//改变label.Text的值     
          if (this.label1.Text != strText)
          {
              MessageBox.Show("label1的值意外改变", "错误提示");
          }    
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message, "跨线程访问错误提示");
     }        
 }
        
Publicado 18 artículos originales · elogiado 0 · visitas 233

Supongo que te gusta

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