una tiene net metodo instanciar firma eventos evento deshabilitar delegados delegado crear con compatible c# asynchronous delegates

tiene - instanciar un evento c#



¿Cuál es la firma del método para pasar un delegado asíncrono? (2)

El tipo de devolución del signatue del método es Task si no hay un tipo de devolución, o Task<T> si hay un tipo de devolución.

Tho, no estoy 100% seguro si puedes tener lambdas asincrónicas así.

En el método que consume la tarea, o bien ''aguarda'' la tarea o usa las propiedades y métodos en Tarea para obtener el resultado.

Recientemente volví a C # de estar en el terreno de Objective-C, y las palabras clave async / await en C # 5 parecen divertidas. Pero todavía estoy tratando de manejar la sintaxis adecuada.

Quiero declarar un método que tome un delegado asíncrono como parámetro, pero estoy teniendo problemas para corregir tanto la llamada como la sintaxis de llamada. ¿Puede alguien proporcionar una muestra de código que muestre la declaración del método, la llamada y una llamada al delegado?

Estoy pensando que la declaración sería algo como lo siguiente. Tenga en cuenta que esta función no es asincrónica; es decir, su asincronía es independiente del delegado.

void DoSomethingWithCallback(async delegate foo(int)) { ... foo(42); ... }

La llamada sería algo así como:

DoSomethingWithCallback(async (int x) => { this.SomeProperty = await SomeAsync(x); });

Por supuesto, nada de esto compila y la mayoría de las muestras que he visto suponen que uno tiene un campo o propiedad que es el delegado, en lugar del delegado anónimo que me gustaría usar.


Una función que toma un delegado como parámetro debe usar un tipo de delegado con nombre; a diferencia de Objective-C, no puede declarar un tipo de delegado anónimo en línea en la definición de la función. Sin embargo, los genéricos Action <> y Func <> se proporcionan para que no tenga que declarar un nuevo tipo usted mismo. En el siguiente código, supongo que el delegado toma un int único como parámetro.

void DoSomethingWithCallback(Func<int,Task> callbackDelegate) { Task t = callbackDelegate(42); }

Si esta función en realidad no hace nada con el objeto Task devuelto (como con el código que se muestra arriba), en su lugar puede usar Action<int> como el tipo de delegado. Si usa Acción, todavía puede declarar el delegado asincrónico (a continuación) pero se ignora el objeto Tarea implícita devuelto.

La sintaxis lambda para llamar a la función anterior es sencilla y la sintaxis que utilizó en la pregunta es correcta. Tenga en cuenta que el tipo de parámetro no necesita ser especificado aquí ya que puede ser inferido:

DoSomethingWithCallback(async (intParam) => { this.myint = await Int2IntAsync(intParam); });

También puede pasar un método o delegar una variable, si lo desea, en lugar de utilizar la sintaxis lambda:

async Task MyInt2Int(int p) { ... } Func<int,Task> myDelegate; void OtherMethod() { myDelegate = MyInt2Int; DoSomethingWithCallback(myDelegate); // this ... DoSomethingWithCallback(MyInt2Int); // ... or this. }