Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

313
Vistas
No esperar una llamada asíncrona sigue siendo asíncrono, ¿verdad?

Lo siento si esta es una pregunta tonta (o un duplicado).

Tengo una función A :

 public async Task<int> A(/* some parameters */) { var result = await SomeOtherFuncAsync(/* some other parameters */); return (result); }

Tengo otra función B , llamando a A pero sin usar el valor de retorno:

 public Task B(/* some parameters */) { var taskA = A(/* parameters */); // #1 return (taskA); }

Tenga en cuenta que B no se declara async y no está esperando la llamada a A . La llamada a A no es una llamada de disparar y olvidar; C llama a B así:

 public async Task C() { await B(/* parameters */); }

Tenga en cuenta que en el n . ° 1 , no hay await . Tengo un compañero de trabajo que afirma que esto hace que la llamada a A sea sincrónica y sigue presentando registros de Console.WriteLine que aparentemente prueban su punto.

Traté de señalar que solo porque no esperamos los resultados dentro de B , se espera la cadena de tareas y la naturaleza del código dentro de A no cambia solo porque no lo esperamos. Dado que el valor de retorno de A no es necesario, no es necesario esperar la tarea en el sitio de la llamada, siempre que alguien de la cadena lo espere (lo que sucede en C ).

Mi compañero de trabajo es muy insistente y comencé a dudar de mí mismo. ¿Está mal mi entendimiento?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Tienes razón. Crear una tarea solo hace eso y no le importa cuándo y quién esperará su resultado. Intenta poner await Task.Delay(veryBigNumber); en SomeOtherFuncAsync y la salida de la consola debería ser la esperada.

Esto se llama eliding y le sugiero que leaesta publicación de blog, donde puede ver por qué debería o no hacer tal cosa.

También algunos ejemplos mínimos (poco enrevesados) que copian su código y le dan la razón:

 class Program { static async Task Main(string[] args) { Console.WriteLine($"Start of main {Thread.CurrentThread.ManagedThreadId}"); var task = First(); Console.WriteLine($"Middle of main {Thread.CurrentThread.ManagedThreadId}"); await task; Console.WriteLine($"End of main {Thread.CurrentThread.ManagedThreadId}"); } static Task First() { return SecondAsync(); } static async Task SecondAsync() { await ThirdAsync(); } static async Task ThirdAsync() { Console.WriteLine($"Start of third {Thread.CurrentThread.ManagedThreadId}"); await Task.Delay(1000); Console.WriteLine($"End of third {Thread.CurrentThread.ManagedThreadId}"); } }

Esto escribe Middle of main antes End of third , lo que demuestra que, de hecho, es asíncrono. Además, puede (lo más probable) ver que los extremos de las funciones se ejecutan en un subproceso diferente al del resto del programa. Tanto los comienzos como la mitad de main siempre se ejecutarán en el mismo subproceso porque, de hecho, son sincrónicos (main comienza, llama a la cadena de funciones, el tercero regresa (puede regresar en la línea con la palabra clave await ) y luego main continúa como si hubiera Nunca hubo una función asincrónica involucrada.Las terminaciones después de las palabras clave await en ambas funciones pueden ejecutarse en cualquier subproceso en ThreadPool (o en el contexto de sincronización que está utilizando).

Ahora es interesante notar que si Task.Delay en Third no tomara mucho tiempo y realmente terminara sincrónicamente, todo esto se ejecutaría en un solo hilo. Además, aunque se ejecutaría de forma asíncrona, podría ejecutarse todo en un solo subproceso. No existe una regla que indique que una función asíncrona usará más de un subproceso, es muy posible que solo haga otro trabajo mientras espera que finalice alguna tarea de E/S.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda