understanding - task.run async c#
¿Async/Await utiliza Task.Run iniciando un nuevo hilo de forma asíncrona? (3)
1
Hay una gran diferencia si no await
la Task
o la await
:
Caso no lo
await
: se llamaDoSomething
pero la siguiente oración se ejecuta mientras laTask
DoSomething
no se ha completado.Caso lo
await
: se llamaDoSomething
y la siguiente oración se ejecuta una vez que se ha completado laTask
DoSomething
.
Por lo tanto, la necesidad de async
/ await
dependerá de cómo desea llamar a DoSomething
: si no lo await
, es como llamarlo fuego y olvidar .
2
¿Se está ejecutando en la interfaz de usuario principal pero en un subproceso separado o se está ejecutando en un subproceso separado y separado es asíncrono dentro de ese método?
El código asíncrono a veces significa otro subproceso (consulte esta P y R asíncrono frente a multiproceso: ¿hay alguna diferencia? ). Es decir, ya sea si el código se está ejecutando en un subproceso separado de la IU o si continuamos con el procesamiento del subproceso de la IU mientras se reanuda, es bueno porque el bucle de la IU todavía puede actualizar la pantalla mientras se realizan otras tareas en paralelo sin congelar la interfaz de usuario.
Un método asíncrono (es decir, un método async
) es un azúcar sintáctico para indicar al compilador que las declaraciones de await
deben tratarse como una máquina de estados. El compilador de C # convierte su código async
/ await
en una máquina de estado donde el código que espera Task
resultado de una Task
se ejecuta después del código que se está esperando.
Preguntas y respuestas interesantes
Es posible que desee revisar estas otras preguntas y respuestas:
- Async / Await vs Hilos
- ¿Cuál es la diferencia entre Task.Start / Wait y Async / Await?
- async / await: ¿Cuándo devolver una Tarea vs nulo?
- ¿Async espera la palabra clave equivalente a una ContinueWith lambda?
OP dijo ...
[...] Pero, ¿significa esto que "async / await" activará un subproceso y Task.Run también disparará un subproceso o ambos son el mismo subproceso?
Usando async
- await
no significa "creo un hilo" . Es solo un azúcar sintáctico para implementar las continuaciones de una manera elegante. Una tarea puede o no ser un hilo. Por ejemplo, Task.FromResult(true)
crea una tarea falsa para poder implementar un método asíncrono sin necesidad de crear un subproceso:
public Task<bool> SomeAsync()
{
// This way, this method either decides if its code is asynchronous or
// synchronous, but the caller can await it anyway!
return Task.FromResult(true);
}
He leído muchos artículos y todavía no puedo entender esta parte.
Considere este código:
private async void button1_Click(object sender, EventArgs e)
{
await Dosomething();
}
private async Task<string> Dosomething()
{
await Task.Run((() => "Do Work"));
return "I am done";
}
Primera pregunta:
Cuando hago clic en el botón, Llamará a DoSomething y esperará una Tarea que crea un Thread desde el conjunto de subprocesos llamando a Task.Run (si no estoy equivocado) y todo esto se ejecuta de forma asíncrona. ¿Así que logré crear un hilo que hace mi trabajo pero haciéndolo de forma asíncrona? Pero tenga en cuenta que no necesito que me devuelvan ningún resultado, solo quiero que el trabajo se realice sin recuperar ningún resultado, ¿es realmente necesario usar async / await y, de ser así, cómo?
Segunda pregunta:
Cuando se ejecuta un subproceso de forma asíncrona, ¿cómo funciona eso? ¿Se está ejecutando en la interfaz de usuario principal pero en un subproceso independiente o se está ejecutando en un subproceso independiente y separado es asíncrono dentro de ese método?
- El propósito de crear métodos Async es para que puedas esperarlos más tarde. Algo así como "Voy a poner esta agua a hervir, terminar de preparar el resto de los ingredientes de mi sopa, y luego regresar a la olla y esperar a que el agua termine de hervir para que pueda preparar la cena". Usted comienza a hervir el agua, lo que hace de forma asíncrona mientras hace otras cosas, pero finalmente tiene que detenerse y esperar. Si lo que quieres es "disparar y olvidar", Async y Await no son necesarios.
¿La forma más sencilla de hacer un método de fuego y olvidar en C #?
- El inicio de una nueva tarea pone en cola esa tarea para su ejecución en un subproceso de subprocesos. Los subprocesos se ejecutan en el contexto del proceso (por ejemplo, el ejecutable que ejecuta su aplicación). Si esta es una aplicación web que se ejecuta bajo IIS, ese hilo se crea en el contexto del proceso de trabajo de IIS. Ese hilo se ejecuta por separado del hilo de ejecución principal, por lo que se apaga y hace su trabajo independientemente de lo que esté haciendo su hilo de ejecución principal y, al mismo tiempo, su hilo de ejecución principal avanza con su propio trabajo.
El tipo Task<TResult>
requiere que devuelva un TResult
de su tarea. Si no tiene nada que devolver, puede usar la Task
lugar (que, por cierto, es la clase base de la Task<TResult>
).
Pero tenga en cuenta que una tarea no es un hilo. Una tarea es un trabajo a realizar, mientras que un subproceso es un trabajador. A medida que se ejecuta su programa, los trabajos y los trabajadores están disponibles y no están disponibles. Detrás de escena, la biblioteca asignará sus trabajos a los trabajadores disponibles y, como la creación de nuevos trabajadores es una operación costosa, por lo general preferirá reutilizar los existentes, a través de un grupo de subprocesos.