Después de lidiar con el patrón asíncrono / espera de C # por un tiempo, de repente me di cuenta de que realmente no sé cómo explicar lo que sucede en el siguiente código:
async void MyThread()
{
while (!_quit)
{
await GetWorkAsync();
}
}
GetWorkAsync()
se supone que devuelve un objeto de espera Task
que puede o no causar un cambio de hilo cuando se ejecuta la continuación.
No estaría confundido si la espera no estuviera dentro de un bucle. Naturalmente, esperaría que el resto del método (es decir, continuación) se ejecute potencialmente en otro hilo, lo cual está bien.
Sin embargo, dentro de un bucle, el concepto de "el resto del método" me resulta un poco confuso.
¿Qué sucede con "el resto del bucle" si el hilo se enciende en continuación vs. si no se cambia? ¿En qué hilo se ejecuta la siguiente iteración del bucle?
Mis observaciones muestran (no verificadas de manera concluyente) que cada iteración comienza en el mismo hilo (el original) mientras que la continuación se ejecuta en otro. ¿Puede esto ser realmente? En caso afirmativo, ¿es este un grado de paralelismo inesperado que debe tenerse en cuenta frente a la seguridad de subprocesos del método GetWorkAsync?
ACTUALIZACIÓN: Mi pregunta no es un duplicado, como lo sugieren algunos. El while (!_quit) { ... }
patrón de código es simplemente una simplificación de mi código real. En realidad, mi hilo es un ciclo de larga duración que procesa su cola de entrada de elementos de trabajo a intervalos regulares (cada 5 segundos por defecto). La verificación de la condición de abandono real tampoco es una simple verificación de campo como lo sugiere el código de muestra, sino más bien una verificación del controlador de eventos.