una tipos que puede programacion interfaz interfaces instancia implementacion declaracion declara cómo crear clase atributos abstracta c# .net-4.5 async-await

c# - tipos - que es una interfaz en programacion



Cómo utilizar aguardar en métodos en interfaces. (3)

Cuando se implementa en una interfaz (por simulacro, comunicación remota o similar) utilizando la palabra clave await y teniendo una interfaz con métodos que devuelven la tarea <>:

interface IFoo { Task<BigInteger> CalculateFaculty(int value); }

El compilador aparece con un error:

El operador ''await'' solo se puede utilizar dentro de un método asíncrono. Considere marcar este método con el modificador ''asíncrono'' y cambiar su tipo de retorno a ''Tarea''

Lo cual es un poco inusual considerando que el tipo de retorno es "Tarea". Este problema es algo frustrante y me obliga a "retroceder" usando un estilo de continuación o proporcionando un proxy adicional alrededor de esta interfaz (y, por lo tanto, para casi todas las interfaces que no es realmente posible para mí)

¿Alguien tiene una buena idea sobre cómo resolver esto?


El mensaje del compilador no está en el uso en la interfaz. Es una solicitud asíncrona en una tarea que es implementada por el tiempo de ejecución cuando se encuentra una espera apropiada en la operación.

El uso debe estar en la implementación del método, es decir. la clase; el uso de la interfaz es el mismo que para los configuradores y captadores en una interfaz.


El mensaje no es sobre la interfaz, sino sobre el método de llamada. Debe marcar el método que contiene la palabra clave async con el modificador async :

public interface IFoo { Task<int> AwaitableMethod(); } class Bar { static async Task AsyncMethod() // marked as async! { IFoo x; await x.AwaitableMethod(); } }


Esto debe estar bien:

interface IFoo { Task<BigInteger> CalculateFaculty(int value); } public class Foo: IFoo { public async Task<BigInteger> CalculateFaculty(int value) { var res = await AsyncCall(); return res; } }

uso:

public async Task DoSomething(IFoo foo) { var result = await foo.CalculateFaculty(123); }