Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

321
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!