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

185
Views
¿Por qué tengo que usar await para que un método se ejecute de forma asíncrona? ¿Qué pasa si no quiero esperar a que termine el método antes de continuar?

He estado revisando documentos de MSDN todo el día y su filosofía de codificación asincrónica me confunde. Según tengo entendido, el subproceso que llama al método asíncrono no se bloqueará si se llama al método asíncrono. Sin embargo, async siempre se empareja en los ejemplos con await, lo que parece negar la asincronía, lo que hace que el método externo SÍ tenga que esperar a que el código se ejecute de todos modos. ¿No debería poder llamar a un método asíncrono y luego continuar con la ejecución del método externo?

Este es el escenario que he estado encontrando, más o menos:

 void reportSomethingHappened(info) - Collect info - HTTP POST info to logging server (ie. mixpanel, sentry)

Y aquí sería un método de llamada:

 void largerProcess if (whatever) reportSomethingHappened(); bla; bla;

Según tengo entendido, dado que las solicitudes POST se pueden realizar de forma asíncrona, debería poder convertir reportSomethingHappened() en un método asíncrono (por, AFAIK, esperando la solicitud web y agregando la palabra clave asíncrona).

Pero el método largeProcess no necesita esperar (es decir, esperar) que el método de informe finalice para ejecutar bla bla. Sin embargo, VS me dice que con un método asíncrono puedo esperarlo o sucederá sincrónicamente y bloquearé. ¿Eso no anula el propósito de hacerlo por separado?

¿Cómo escribo esto para que reportSomethingHappened no bloquee la ejecución de un proceso más grande? (Lo que me confunde inherentemente, porque pensé que ese era el punto de asincronía todo el tiempo)

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Si llama a un método asíncrono, se ejecutará de forma asíncrona tanto si await la tarea devuelta como si no.

await no afecta cómo se ejecuta el método, solo cómo usted, como la persona que llama, lo maneja. Puede llamar al método asíncrono, obtener la tarea y esperarla de inmediato (que es la opción más simple). Eso le permitirá escribir código que parece síncrono pero se ejecuta de forma asíncrona, ya que await básicamente registra el resto del código después de él como una devolución de llamada que se ejecutará solo después de que se complete la tarea esperada. Esto no se bloquea en el tradicional ya que no se bloquea ningún hilo, pero el flujo de código será secuencial:

 async Task LargerProcessAsync() { if (condition) { await ReportSomethingHappenedAsync(); } // do other stuff }

Sin embargo, no es absolutamente necesario que hagas eso. Puede recuperar la tarea, hacer otras cosas y solo await :

 async Task LargerProcessAsync() { Task task = null; if (condition) { task = ReportSomethingHappenedAsync(); } // do other stuff if (task != null) { await task; } }

O simplemente puede eliminar la await por completo. Sin embargo, debe darse cuenta de que esto puede ser peligroso ya que la tarea puede fallar y la excepción puede pasar desapercibida y es por eso que no se recomienda. Hay varias maneras de hacer esto bien, pero no son simples. Puedes usar Task.ContinueWith :

 void LargerProcess() { if (condition) { ReportSomethingHappenedAsync().ContinueWith(task => { try { task.Wait(); } catch (Exception exception) { // handle exception } }) } // do other stuff }

O para ASP.Net, mire Fire and Forget en ASP.NET

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!