Soy nuevo en .NET y escribo un programa para la prueba. En este momento estoy usando TaskAwaiter y cuando recibo camarero de su instancia, siempre devuelve falso en camarero. Está completo y no sé por qué y cómo solucionarlo. ? ¿Lo estoy usando mal?

TaskAwaiter<HttpResponseMessage> awaiter;
str = "login.action";
awaiter = client.client.GetAsync(str).GetAwaiter();
if (awaiter.IsCompleted)
{
  break;
}
0
Farhad Hessari 1 may. 2020 a las 09:52

2 respuestas

La mejor respuesta

¿Lo estoy usando mal?

Está asumiendo que una solicitud HTTP ocurre de inmediato. Este no es el caso. Tienes que esperarlo.

Hay casos extremos en los que el método asincrónico llamado puede no ser asíncrono, es decir, devolver un resultado en caché, y esos son los ÚNICOS casos en los que obtendrá un IsCompleted = true justo después de llamar.

3
TomTom 1 may. 2020 a las 07:02

Parece que no tienes una definición de ciclo correcta. Debería ser algo como esto:

TaskAwaiter<HttpResponseMessage> awaiter;
str = "login.action";
awaiter = client.client.GetAsync(str).GetAwaiter();
while (true)
{
  if (awaiter.IsCompleted)
  {
    break;
  }
}

O será mejor escribir de esta manera: while (!awaiter.IsComleted) {}

O la mejor práctica es utilizar async/await palabras clave. Por ejemplo:

public async Task YourMethodName()
{
  ...
  str = "login.action";
  HttpResponseMessage response = await client.client.GetAsync(str);
  ...
}
1
Nikolay 1 may. 2020 a las 07:11