Pregunta Cómo usar BeginInvoke C #


¿Podría explicarme esto por favor?

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

¿Podría decirme cómo puedo usar begininvoke ¿exactamente? Que es Action ¿tipo? Por qué hay corchetes en blanco ()? Y eso qué quiere decir =>?


37
2018-01-17 21:07


origen


Respuestas:


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

() => es expresión lambda sintaxis. Las expresiones Lambda no son del tipo Delegate. Invocar requiere Delegate asi que Action puede ser utilizado para envolver la expresión lambda y proporcionar el esperado Type a Invoke()

Invoke causas dijo Action para ejecutar 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 el Rtf propiedad en una RichTextBox cuando es necesaria una Invocación, sin llamar primero a Invocar, entonces una Cross-thread operation not valid se lanzará una excepción. Comprobar 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.


61
2018-01-17 21:20



Supongo que su código se relaciona con Windows Forms.
Llama 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 BeginInvoke se llama para Delegate escriba que el delegado se acaba de invocar 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 el Task con el acuerdo contexto. (TaskScheduler.FromCurrentSynchronizationContext())

Y para agregar un poco a lo ya dicho por otros: Lambdas puede tratarse como métodos anónimos o expresiones.
Y es por eso que no puedes simplemente 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 finalización task.Wait() bloqueará el hilo de llamada hasta el final de la tarea.

Lea más acerca de las tareas aquí.


9
2018-01-17 21:15