c# begininvoke

Cómo usar BeginInvoke C#



(2)

¿Podría explicarme esto por favor?

someformobj.BeginInvoke((Action)(() => { someformobj.listBox1.SelectedIndex = 0; }));

¿Podría decirme cómo puedo usar begininvoke exactamente? ¿Qué es el tipo de Action ? ¿Por qué hay corchetes en blanco () ? ¿Y qué significa esto => ?


Supongo que su código se relaciona con Windows Forms.
Llame a BeginInvoke si necesita que se ejecute algo de manera asincrónica en el hilo de la interfaz de usuario: cambie las propiedades del control en la mayoría de los casos.
En términos generales, esto se logra pasando el delegado a algún procedimiento que se ejecuta periódicamente. (Procesamiento de bucle de mensaje y cosas así)

Si se llama a BeginInvoke para delegar, el delegado se invoca de forma asincrónica.
( Invoke para la versión de sincronización)

Si desea un código más universal que funcione perfectamente para WPF y WinForms, puede considerar Task Parallel Library y ejecutar la Task con el context . ( TaskScheduler.FromCurrentSynchronizationContext() )

Y para agregar un poco a lo ya dicho por otros: Lambdas puede tratarse como métodos o expressions anónimos.
Y es por eso que no puedes usar var con lambdas: el compilador necesita una pista.

ACTUALIZAR:

esto requiere .Net v4.0 y superior

// This line must be called in UI thread to get correct scheduler var scheduler = System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext(); // this can be called anywhere var task = new System.Threading.Tasks.Task( () => someformobj.listBox1.SelectedIndex = 0); // also can be called anywhere. Task will be scheduled for execution. // And *IF I''m not mistaken* can be (or even will be executed synchronously) // if this call is made from GUI thread. (to be checked) task.Start(scheduler);

Si comenzó la tarea desde otro hilo y necesita esperar su task.Wait() finalización. task.Wait() bloqueará el hilo de llamada hasta el final de la tarea.

Lea más acerca de las tareas here .


Action es un tipo de delegado proporcionado por .NET framework. La Action apunta a un método sin parámetros y no devuelve un valor.

() => es sintaxis de expresión lambda . Las expresiones Lambda no son de tipo Delegate . Invoke requiere Delegate para que Action se pueda usar para ajustar la expresión lambda y proporcionar el Type esperado a Invoke()

Invoke hace que dicha Action ejecute en el subproceso que creó el identificador de ventana del Control. Cambiar los hilos a menudo es necesario para evitar Exceptions . Por ejemplo, si uno intenta establecer la propiedad Rtf en un RichTextBox cuando es necesaria una Invocación, sin llamar primero a Invoke, se lanzará una excepción de Cross-thread operation not valid . Verifique Control.InvokeRequired antes de llamar a Invoke.

BeginInvoke es la versión asincrónica de Invoke . Asíncrono significa que el hilo no bloqueará a la persona que llama en lugar de una llamada síncrona que está bloqueando.