c# .net multithreading wcf-data-services

c# - Despachador BeginInvoke Sintaxis



.net multithreading (3)

El problema es que el compilador no sabe a qué tipo de delegado está intentando convertir la expresión lambda. Puedes arreglar eso con un molde, o una variable separada:

private void OnSaveCompleted(IAsyncResult result) { Dispatcher.BeginInvoke((Action) (() => { context.EndSaveChanges(result); })); }

o

private void OnSaveCompleted(IAsyncResult result) { Action action = () => { context.EndSaveChanges(result); }; Dispatcher.BeginInvoke(action); }

He intentado seguir algunos ejemplos de WCF Data Services y tengo el siguiente código:

private void OnSaveCompleted(IAsyncResult result) { Dispatcher.BeginInvoke(() => { context.EndSaveChanges(result); }); }

Que es llamado por lo siguiente:

this.context.BeginSaveChanges(SaveChangesOptions.Batch, this.OnSaveCompleted, null);

Ahora me estoy confundiendo un poco aquí. En primer lugar, el primer bit de código muestra un error de sintaxis de "Argument type lambda expression no se puede asignar al parámetro type System.Delegate". Entonces, en lugar de intentar ciegamente seguir el código de ejemplo, traté de entender qué estaba pasando aquí. Lamentablemente, estoy luchando por comprender el error y lo que realmente está sucediendo.

Me siento un poco estúpido ya que estoy seguro de que es fácil.

Gracias de antemano por cualquier aclaración!


La respuesta de Jon Skeet es muy buena, pero hay otras posibilidades. Prefiero "comenzar a invocar nuevas acciones", que es fácil de leer y recordar para mí.

private void OnSaveCompleted(IAsyncResult result) { Dispatcher.BeginInvoke(new Action(() => { context.EndSaveChanges(result); })); }

o

private void OnSaveCompleted(IAsyncResult result) { Dispatcher.BeginInvoke(new Action(delegate { context.EndSaveChanges(result); })); }

o

private void OnSaveCompleted(IAsyncResult result) { Dispatcher.BeginInvoke(new Action(() => context.EndSaveChanges(result))); }


Si su método no requiere parámetros, esta es la versión más corta que encontré:

Application.Current.Dispatcher.BeginInvoke((Action)MethodName);