run method explained espaƱol create await async c# .net asynchronous .net-4.5 async-await

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étodo GetAwaiter 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 devuelva void o TResult .

( 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 usar Task.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.