El problema es que cargar estos datos requiere llamar a los métodos asíncronos, pero el constructor no puede ser asincrónico.
Aunque no se puede hacer que el constructor sí asíncrono, usted puede llamadas métodos asíncronos desde dentro del constructor. Simplemente no obtendrá los resultados de inmediato.
Siempre que los métodos asincrónicos vuelven Task
o Task<T>
, siempre se puede utilizar una continuación en la tarea de establecer sus datos dentro de la clase una vez que la operación asincrónica, o simplemente bloquear en los resultados, en función de lo que tiene más sentido en tu escenario Sin conocer los requisitos para la construcción de este objeto, es difícil saber qué es apropiado en este escenario.
Editar:
Una opción, teniendo en cuenta los objetivos mencionados anteriormente, sería la de cambiar su declaración Singleton
por lo que el método para recuperar la Instance
era un método, no una propiedad. Esto permitiría que para que sea asíncrono:
public class Singleton
{
private static Singleton instance;
private Singleton()
{
// Don't load the data here - will be called separately
}
public static async Task<Singleton> GetInstance()
{
if (instance == null)
{
instance = new Singleton();
await instance.LoadData();
}
return instance;
}
}
Esto le permitiría utilizar await
en la llamada para recuperar realmente la instancia. Lo bueno de esto es que deja muy claro que está llamando a una operación asincrónica, y obtendrá un manejo adecuado de los resultados, ya que el resultado volverá como cualquier otro método asíncrono.
Tenga en cuenta, sin embargo, que esto no es seguro para subprocesos (aunque tampoco el original), por lo que si va a utilizar este Singleton de varios subprocesos, puede tener que replantearse el diseño general.
La otra opción sería hacer que su clase Singleton
no cargue automáticamente los datos. Haga que los métodos que recuperan los datos de la clase sean asincrónicos, en su lugar. Esto proporciona algunas ventajas reales, ya que el uso es probablemente un poco más estándar, y puede admitir llamadas de múltiples hilos de una manera más sencilla (ya que puede controlar el proceso de carga de datos) de lo que sería capaz de manejarlo haciendo que el acceso de la instancia de clase asincrónica.
Usando Lazy debe hacer lo que quiera. –
también puede llamar a un método asíncrono desde un constructor. – DarthVader
Proporcione más contexto sobre lo que quiere que suceda. No está claro en este momento. –