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.