[C#] Llamando al método asincrónico sincrónicamente


Answers

Debe obtener el awaiter ( GetAwaiter() ) y finalizar la espera para completar la tarea asincrónica ( GetResult() ).

string code = GenerateCodeAsync().GetAwaiter().GetResult();
Question

Tengo un método async :

public async Task<string> GenerateCodeAsync()
{
    string code = await GenerateCodeService.GenerateCodeAsync();
    return code;
}

Necesito llamar a este método desde un método sincrónico.

¿Cómo puedo hacer esto sin tener que duplicar el método GenerateCodeAsync para que esto funcione sincrónicamente?

Actualizar

Sin embargo, no se encontró una solución razonable.

Sin embargo, veo que HttpClient ya implementa este patrón

using (HttpClient client = new HttpClient())
{
    // async
    HttpResponseMessage responseAsync = await client.GetAsync(url);

    // sync
    HttpResponseMessage responseSync = client.GetAsync(url).Result;
}



Necesito llamar a este método desde un método sincrónico.

Es posible con GenerateCodeAsync().Result o GenerateCodeAsync().Wait() , como sugiere la otra respuesta. Esto bloquearía el hilo actual hasta que se complete GenerateCodeAsync .

Sin embargo, su pregunta está etiquetada con asp.net , y también dejó el comentario:

Esperaba una solución más simple, pensando que asp.net manejó esto mucho más fácil que escribir tantas líneas de código

Mi punto es que no deberías estar bloqueando un método asincrónico en ASP.NET. Esto reducirá la escalabilidad de su aplicación web y puede crear un punto muerto (cuando se await una continuación dentro de GenerateCodeAsync en AspNetSynchronizationContext ). El uso de Task.Run(...).Result de descargar algo a un subproceso del grupo y luego bloquear afectará aún más la escalabilidad, ya que incurre en +1 subproceso más para procesar una solicitud HTTP determinada.

ASP.NET tiene soporte integrado para métodos asincrónicos, ya sea a través de controladores asíncronos (en ASP.NET MVC y API web) o directamente a través de AsyncManager y PageAsyncTask en ASP.NET clásico. Deberías usarlo Para más detalles, verifique esta respuesta .