usar understanding run puede method funciones ejemplos create await async c# multithreading async-await task-parallel-library c#-5.0

understanding - task.run async c#



¿El uso de async/await crea un nuevo hilo? (4)

Así que he estado leyendo sobre el modelo de subprocesos, y Async / Await ciertamente puede llevar a que se usen nuevos subprocesos (no necesariamente creados, el grupo los crea al inicio de la aplicación). Depende del planificador determinar si se necesita un nuevo subproceso. Y como lo veo, una llamada a una función en espera puede tener detalles internos que aumentan las posibilidades de que el programador utilice otro hilo; simplemente porque más trabajo significa más oportunidades / razones para que el planificador distribuya el trabajo.

Las operaciones asincrónicas de WinRT se realizan automáticamente en el grupo de subprocesos. Y normalmente llamará DESDE el grupo de subprocesos, excepto para el trabajo de subprocesos de la interfaz de usuario. Xaml / Input / Events.

Las operaciones asíncronas iniciadas en subprocesos de Xaml / UI tienen sus resultados entregados nuevamente al subproceso de UI [llamada]. Pero los resultados de la operación asincrónica iniciados desde un subproceso de grupo de subprocesos se entregan donde se completa, lo que puede no ser el mismo subproceso en el que estaba antes. La razón detrás de esto es que es probable que el código escrito para el grupo de subprocesos se escriba para que sea seguro para subprocesos y también es para eficiencia, Windows no tiene que negociar ese cambio de subproceso.

De nuevo, en respuesta al OP, los nuevos hilos no se crean necesariamente, pero su aplicación puede y usará múltiples hilos para completar el trabajo asincrónico.

Sé que esto parece contradecir parte de la literatura sobre async / await, pero eso se debe a que aunque la construcción async / await no es por sí misma multiproceso. Los elementos de espera son el, o uno de los mecanismos por los cuales el programador puede dividir el trabajo y construir llamadas a través de hilos.

Esto está al límite de mi conocimiento en este momento con respecto a la sincronización y el subproceso, por lo que es posible que no lo tenga exactamente correcto, pero creo que es importante ver la relación entre lo que se puede esperar y el subproceso.

Soy nuevo en TPL y me pregunto: ¿cómo se relaciona la programación asincrónica que es nueva en C # 5.0 (a través de las nuevas palabras clave async y en await ) con la creación de hilos?

Específicamente, ¿el uso de async/await crea un nuevo hilo cada vez que se usan? Y si hay muchos métodos anidados que usan async/await , ¿se crea un nuevo hilo para cada uno de esos métodos?


El uso de Async / Await no necesariamente hace que se cree un nuevo hilo. Pero el uso de Async / Await puede llevar a que se cree un nuevo hilo porque la función de espera puede generar internamente un nuevo hilo. Y a menudo lo hace, haciendo que la afirmación ''No, no genera hilos'' sea casi inútil en la práctica. Por ejemplo, el siguiente código genera nuevos hilos.

VisualProcessor.Ctor() { ... BuildAsync(); } async void BuildAsync() { ... TextureArray dudeTextures = await TextureArray.FromFilesAsync(…); } public static async Task<TextureArray> FromFilesAsync(...) { Debug.WriteLine("TextureArray.FromFilesAsync() T1 : Thread Id = " + GetCurrentThreadId()); List<StorageFile> files = new List<StorageFile>(); foreach (string path in paths) { if (path != null) files.Add(await Package.Current.InstalledLocation.GetFileAsync(path)); // << new threads else files.Add(null); } Debug.WriteLine("TextureArray.FromFilesAsync() T2 : Thread Id = " + GetCurrentThreadId()); ... }


En resumen NO

Desde la programación asincrónica con asíncrono y espera: subprocesos

Las palabras clave asíncronas y en espera no hacen que se creen hilos adicionales. Los métodos asincrónicos no requieren subprocesos múltiples porque un método asincrónico no se ejecuta en su propio hilo. El método se ejecuta en el contexto de sincronización actual y usa el tiempo en el hilo solo cuando el método está activo. Puede usar Task.Run para mover el trabajo vinculado a la CPU a un subproceso en segundo plano, pero un subproceso en segundo plano no ayuda con un proceso que solo está esperando que los resultados estén disponibles.


Perdón por llegar tarde a la fiesta.

Soy nuevo en TPL y me pregunto: ¿cómo se relaciona la programación asincrónica que es nueva en C # 5.0 (a través de las nuevas palabras clave asíncronas y en espera) con la creación de hilos?

async/await no se introduce para la creación de subprocesos, sino para utilizar el subproceso actual de manera óptima.

Su aplicación puede leer archivos, esperar la respuesta de otro servidor o incluso hacer un cálculo con acceso de memoria alta (simplemente cualquier tarea de E / S). Estas tareas no requieren mucha CPU (cualquier tarea que no use el 100% de su hilo).

Piensa que estás procesando 1000 tareas que no requieren mucha CPU . En este caso, el proceso de creación de miles de subprocesos a nivel del sistema operativo podría consumir más CPU y memoria que el trabajo real en un solo subproceso (4 MB por subproceso en Windows, 4 MB * 1000 = 4 GB ). Al mismo tiempo, si ejecuta todas las tareas de forma secuencial, es posible que deba esperar hasta que finalicen las tareas de E / S. Que terminan en mucho tiempo para completar la tarea, manteniendo la CPU inactiva.

Dado que requerimos el paralelismo para completar múltiples tareas rápidamente, al mismo tiempo, todas las tareas de Parellal no requieren mucha CPU, pero crear subprocesos es ineficiente.

El compilador interrumpirá la ejecución en cualquier llamada a un método async (independientemente de si se awaited o no) e inmediatamente ejecutará el código restante, una vez await se llegue a una await , la ejecución irá dentro de la async anterior. Esto se repetirá una y otra vez hasta que se completen todas las llamadas asíncronas y se satisfaga a sus awaiters .

Si alguno de los métodos asincrónicos tiene una gran carga de CPU sin una llamada a un método asincrónico, entonces sí, su sistema dejará de responder y todos los métodos asincrónicos restantes no serán llamados hasta que finalice la tarea actual.