Compartir tecnología

Programación asincrónica de C# Uso y función de invocar, comenzarInvoke, endInvoke

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Programación asincrónica de C# Uso y función de invocar, comenzarInvoke, endInvoke

1. Invocar

La esencia de Invoke es solo un método, y el método debe llamarse a través de un objeto.

En términos generales, solo hay dos situaciones en las que realmente se usa Invoke:

Invocar control

DelegarInvocar

En otras palabras, Invoke va precedido de un control o de un objeto delegado.

Invocar control

Invoke de Control se usa generalmente para resolver problemas de acceso entre subprocesos. Por ejemplo, si desea operar un botón, debe usar button.Invoke. Si desea operar una etiqueta de texto, debe usar label.Invoke. A todos les resultará muy problemático. Si quiero operar tanto el botón como la etiqueta, ¿puedo escribirlos juntos? seguro.

Sabemos que el formulario principal es un Formulario, y Form hereda naturalmente el Control, por lo que Form también tiene el método Invoke, que puede llamar directamente a Form.Invoke. Este es nuestro this.Invoke común. Es por eso que algunas Invocaciones no tienen nada delante. De hecho, hay esto delante, pero se omite.

Ejemplo:

this.Invoke(new Action(() =>{ button1.Text = "关闭";}));

DelegarInvocar

Invoke del delegado en realidad llama al método delegado del grupo de subprocesos para su ejecución. Invoke es un método sincrónico y bloqueará el subproceso de la interfaz de usuario que lo llama.

  1. void PrintMessage(string message) 
  2.     { 
  3.         Console.WriteLine(message); 
  4.     } 
  5.     MyDelegate myDelegate = PrintMessage; 
  6.     myDelegate.Invoke("Hello, World!"); // 使用 Invoke 方法调用委托引用的方法`

comenzarInvocar、finalizarInvocar

Ya sabemos que async/await, la clase BackGroudWorker y TPL (Biblioteca paralela de tareas) existen en C#. Por supuesto, C# todavía tiene algunos patrones antiguos para admitir la programación asincrónica.

  1.     delegate long MyDel(int first, int second);
  2.     
  3.     class Program
  4.     {
  5.         static long Sum(int x, int y)
  6.         {
  7.             Console.WriteLine("------Inside Sum@{0}", DateTime.Now.ToString());
  8.             Thread.Sleep(2000);
  9.             return x + y;
  10.         }
  11.     
  12.         static void Main(string[] args)
  13.         {
  14.             MyDel del = new MyDel(Sum);
  15.     
  16.             Console.WriteLine("Before BeginInvoke---@{0}", DateTime.Now.ToString());
  17.             IAsyncResult iar = del.BeginInvoke(3, 5, null, null);
  18.             Console.WriteLine("After BeginInvoke@{0}", DateTime.Now.ToString());
  19.     
  20.             Console.WriteLine("Doing stuff@{0}", DateTime.Now.ToString());
  21.     
  22.             long result = del.EndInvoke(iar);
  23.             Console.WriteLine("End Invoke@{0}", DateTime.Now.ToString());
  24.     
  25.             Console.WriteLine("After EndInvoke:  {0}", result);
  26.     
  27.             Console.ReadKey();
  28.     
  29.         }
  30.     }

El código anterior define un MyDel delegado y pasa el método Sum a su objeto cuando se llama. Normalmente, cuando llamamos a este objeto delegado, llamará a los métodos incluidos en su lista de llamadas. Al igual que llamar a un método, esto se hace de forma sincrónica.

Pero si el objeto delegado tiene solo un método (método de referencia) en la lista de llamadas, puede ejecutar este método de forma asincrónica. Para hacer esto se utilizan BeginInovke y EndInvoke. Podemos usarlo de la siguiente manera:

* ① Cuando llamamos al método BeginInvoke, comienza a ejecutar el método de referencia en un hilo independiente e inmediatamente regresa al hilo original. El hilo original puede continuar y el método de referencia se ejecutará en paralelo en el hilo deseado.
* ② Cuando el programa desea obtener el resultado del método asincrónico completado, puede verificar la propiedad IsCompleted de IAsyncResult devuelta por BeginInvoke, o llamar al método EndInvoke del delegado para esperar a que se complete la ejecución del delegado.

El proceso de uso anterior conduce a tres modos:

* ①Esperar hasta que se complete. Después de que el subproceso original inicia el método asincrónico y realiza algún otro procesamiento, el subproceso original se interrumpe y espera a que se complete el método asincrónico antes de continuar.

* ②Encuesta, el hilo original verifica periódicamente si el hilo iniciado está completo. De lo contrario, puede continuar haciendo otras cosas.

* ③ El hilo original de la devolución de llamada siempre se ejecuta sin esperar ni verificar si el hilo iniciador se completa. Una vez completada la emisión de referencia en el hilo iniciador, el hilo iniciador llamará al método de devolución de llamada y el método de devolución de llamada procesará el resultado. del método asincrónico antes de llamar a EndInvoke.

Sitio web de referencia:

Explicación detallada de la aplicación práctica de Invoke y BeginInvoke en C#_C# Tutorial_Script

Uso del delegado de subprocesos de C# BeginInvoke y EndInvoke_C# Tutorial_Script