explained - run method async c#
Custom awaitables para principiantes (2)
¿Por qué querrías un awaiter personalizado?
Puedes ver la interpretación del compilador here . Esencialmente:
var temp = e.GetAwaiter();
if (!temp.IsCompleted)
{
SAVE_STATE()
temp.OnCompleted(&cont);
return;
cont:
RESTORE_STATE()
}
var i = temp.GetResult();
Editar desde comentarios: OnCompleted
debe programar su argumento como una continuación de la operación asincrónica.
En Async / Await FAQ , Stephen Toub dice:
Un awaitable es cualquier tipo que expone un método
GetAwaiter
que devuelve un awaiter válido.
...
Un awaiter es cualquier tipo devuelto por un métodoGetAwaiter
y que se ajusta a un patrón particular.
Entonces, para ser un " awaiter" , un tipo debería:
- Implemente la interfaz
INotifyCompletion
. - Proporcione una propiedad booleana llamada
IsCompleted
. - Proporcione un método
GetResult
parámetros que devuelvavoid
oTResult
.
( Estoy ignorando ICriticalNotifyCompletion
por ahora ) .
Sé que la página que mencioné tiene una muestra que muestra cómo se traduce el compilador a la espera de las operaciones, pero aún me cuesta entenderlo.
Cuando espero una espera ,
- ¿Cuándo se comprueba
IsCompleted
? ¿Dónde debería configurarlo? - ¿Cuándo se llama
OnCompleted
? - ¿Qué hilo llama a
OnCompleted
? - Vi ejemplos de ambos invocar directamente el parámetro de continuación de
OnCompleted
y usarTask.Run(continuation)
en diferentes ejemplos, ¿a qué debería ir y por qué?
En la gran mayoría de los casos, usted como desarrollador no necesita preocuparse por esto. Use la función async
y await
palabras clave, y el compilador y el tiempo de ejecución manejan todo esto por usted.
Para responder tu pregunta:
¿Cuándo el código comprueba IsCompleted? ¿Dónde debería configurarlo?
La tarea debe establecer IsCompleted
cuando la tarea ha terminado de hacer lo que estaba haciendo. Por ejemplo, si la tarea estaba cargando datos de un archivo, IsCompleted
debería devolver verdadero cuando los datos se cargan y la persona que llama puede acceder a ellos.
¿Cuándo llama OnCompleted?
OnCompleted generalmente contiene un delegado proporcionado por la persona que llama para ejecutarlo cuando la tarea se haya completado.
¿Llama a OnCompleted en paralelo o debe el código dentro de OnCompleted ser asíncrono?
El código en OnCompleted debe ser thread neutral (no importa de qué thread se llama). Esto puede ser problemático para actualizar objetos COM en Single Threaded Apartments (como cualquier clase de UI en las aplicaciones Metro / Windows8 / Windows Store). No tiene que ser asincrónico, pero puede contener código asíncrono.
Vi ejemplos de ambos invocar directamente el parámetro de continuación de OnCompleted y usar Task.Run (continuación) en diferentes ejemplos, ¿a qué debería ir y cuándo?
Usa async
/ await
cuando puedas. De lo contrario, utilice Task.Run () o Task.Wait () porque siguen el modelo de programación secuencial al que la mayoría de la gente está acostumbrada. Es posible que aún se requiera el uso de continuaciones, especialmente en las aplicaciones de Metro en las que tiene problemas con los departamentos.