¿Cómo llamar a un método asíncrono desde un captador o definidor?
¿Cuál sería la forma más elegante de llamar a un método asíncrono desde un captador o definidor en C#?
Aquí hay un pseudocódigo para ayudarme a explicarme.
async Task<IEnumerable> MyAsyncMethod()
{
return await DoSomethingAsync();
}
public IEnumerable MyList
{
get
{
//call MyAsyncMethod() here
}
}
No existe ninguna razón técnicaasync
por la que las propiedades no estén permitidas en C#. Fue una decisión de diseño decidida, porque las "propiedades asincrónicas" son un oxímoron.
Las propiedades deben devolver valores actuales; no deberían iniciar operaciones en segundo plano.
Normalmente, cuando alguien quiere una "propiedad asincrónica", lo que realmente quiere es una de estas:
- Un método asincrónico que devuelve un valor. En este caso, cambie la propiedad a un
async
método. - Un valor que se puede utilizar en el enlace de datos pero que se debe calcular/recuperar de forma asincrónica. En este caso, utilice un
async
método de fábrica para el objeto contenedor o utilice unasync InitAsync()
método. El valor vinculado a datos serádefault(T)
hasta que se calcule/recupere el valor. - Un valor que es costoso de crear, pero que debe almacenarse en caché para uso futuro. En este caso, utilícelo
AsyncLazy
desde mi blog o biblioteca AsyncEx . Esto le dará unaawait
propiedad capaz.
Actualización: cubro las propiedades asincrónicas en una de mis publicaciones recientes de blog sobre "OOP asíncrona".
No puede llamarlo de forma asincrónica, ya que no hay soporte para propiedades asincrónicas, solo métodos asincrónicos. Como tal, hay dos opciones, ambas aprovechando el hecho de que los métodos asincrónicos en el CTP son en realidad solo un método que devuelve Task<T>
o Task
:
// Make the property return a Task<T>
public Task<IEnumerable> MyList
{
get
{
// Just call the method
return MyAsyncMethod();
}
}
O:
// Make the property blocking
public IEnumerable MyList
{
get
{
// Block via .Result
return MyAsyncMethod().Result;
}
}