detener - destruir un hilo c#
¿Qué tan diferente es esperar/asíncrono de subprocesos? (3)
Estoy tratando de familiarizarme con las nuevas palabras clave de espera / async de c #, y he encontrado varios aspectos que no entiendo.
Vamos a empezar con las condiciones de la carrera:
Stream s=... ... for(int i=0;i<100;i++) { s.WriteAsync(new byte[]{i},0,1); }
¿Funcionará como se espera todo el tiempo (por ejemplo, escriba en el archivo 12345 ..... y no 13254 o algo así)?
Lo segundo es que la función asíncrona se ejecuta de forma síncrona si no contiene el operador de espera. Y, según la documentación de Microsoft, las funciones asíncronas siempre se ejecutan en el subproceso de la persona que llama (en comparación con BeginInvoke). Esto me lleva a 3 preguntas siguientes:
¿Cuánto de una función asíncrona se ejecuta antes de que se libere a la función del llamante?
async void MyAsyncFunction() { Operation1(); Operation2(); Operation3(); .... Stream s=...; await s.WriteAsync(....); }
En los artículos sobre espera / asíncrono que he leído, se dice que las funciones asíncronas sin espera del operador se ejecutan de forma secuencial, y con asíncrono / espera de retorno inminente. Pero me está molestando que
MyAsyncFunction
siempre pueda ejecutar Operation1 ... Operation3 antes de soltarlo, ya que los golpesawait s.WriteAsync
.¿Qué pasa si uso
Thread.Sleep
en la función asíncrona como esta:async void DoStuff() { Stream s=...; ... await s.WriteAsync(....); Thread.Sleep(10000); .... }
¿Thread.Sleep bloqueará todo el hilo en el que se ejecuta o solo la función asíncrona?
¿Qué pasa si uso
semaphore.Wait()
en una de las funciones asíncronas y esperará que el semáforo sea liberado por otra función asíncrona? ¿Se comportará esto como lo haría con los hilos, o causará un interbloqueo?await
no funciona fuera de las funciones asíncronas. ¿Por qué?
En resumen, parece que la respuesta es "muy". Si bien lo siguiente puede no responder todas sus preguntas, creo que se aplica a un caso de uso suficientemente general. Piense en su Stream en lugar de en la red IO a la que se refieren.
En el caso de una E / S de red superpuesta, se utilizará un puerto de finalización de E / S, la devolución de llamada se desencadena por una interrupción de hardware.
Esto significa que mientras "esperemos" la finalización, no se consumirá un subproceso. [...]
Es posible hacer todo en 1 hilo. [...] Sin embargo, dependerá de la plataforma, la implementación del "encargado" y el contexto de sincronización que se utilice.
http://social.msdn.microsoft.com/Forums/en-US/async/thread/a46c8a54-f8d4-4fa9-8746-64d6a3a7540d/
Puede encontrar la respuesta a sus preguntas sobre el operador de await
en el siguiente post de Eric Lippert , donde dice que:
El operador de "espera" ... no significa que "este método ahora bloquea el subproceso actual hasta que la operación asíncrona retorne". Eso sería hacer que la operación asíncrona vuelva a ser una operación síncrona, que es precisamente lo que estamos tratando de evitar. Más bien, significa lo opuesto a eso; significa "si la tarea que estamos esperando aún no se ha completado, registre el resto de este método como la continuación de esa tarea y luego vuelva a su interlocutor; la tarea invocará la continuación cuando se complete. - Eric Lippert
Te recomiendo leer mi introducción async
.
¿Funcionará como se espera todo el tiempo (por ejemplo, escriba en el archivo 12345 ..... y no 13254 o algo así)?
No. Es necesario await
las llamadas a WriteAsync
.
¿Cuánto de una función asíncrona se ejecuta antes de que se libere a la función del llamante?
Hasta que se await
una operación que aún no se ha completado.
¿Thread.Sleep bloqueará todo el hilo en el que se ejecuta o solo la función asíncrona?
Thread.Sleep
y todos los demás métodos de bloqueo bloquearán el método async
y el subproceso que lo está ejecutando.
Como regla general, no utilice ningún método de bloqueo dentro de un método async
.
¿Qué pasa si uso semaphore.Wait () en una de las funciones asíncronas y esperará que el semáforo sea liberado por otra función asíncrona? ¿Se comportará esto como lo haría con los hilos, o causará un interbloqueo?
Depende totalmente de tus contextos. Wait
es un método de bloqueo, por lo tanto, si el "otro" método async
requiere el contexto que tiene el método bloqueado, entonces estará bloqueado.
Tenga en cuenta que SemaphoreSlim
es async
-friendly; puede utilizar WaitAsync
lugar de Wait
.
await no funciona fuera de las funciones asíncronas. ¿Por qué?
Porque la palabra clave async
habilita la palabra clave await
. Esto se hizo para minimizar el impacto de las nuevas palabras clave en el lenguaje C # y para la legibilidad del código.