programación programacion ejemplos ejemplo con asíncrona asincrona c# .net task-parallel-library

programacion - programación asíncrona con c# pdf



¿Cómo encadeno operaciones asíncronas con la biblioteca paralela de tareas en.NET 4? (3)

Estoy intentando encadenar programáticamente operaciones asíncronas en C # 4, como las Escrituras en un objeto Stream dado. Originalmente hice esto "manualmente", conectando las devoluciones de llamada de una operación a la siguiente, pero pensé que probaría .NET 4 Task Parallel Library para evitar el problema de reinventar la rueda concurrente.

Para empezar, envuelvo mis llamadas asíncronas en tareas como las siguientes:

public static Task CreateWriteTask(Stream stream, byte[] data) { return Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, data, 0, data.Length, null); }

Las continuaciones han hecho que el encadenamiento de las operaciones síncronas sea muy fácil (si disculpa el desafortunado nombre del método):

public static Task ChainFlush(Stream stream, Task precedingTask) { return precedingTask.ContinueWith(x => stream.Flush()); }

Pero no hay una versión del método Task.ContinueWith que acepte una operación asíncrona de la misma manera que TaskFactory.FromAsync .

Entonces, suponiendo que continúe usando el TPL, busco la implementación correcta de este método:

public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask) { //? }


Intente ContinueWhenAll() o ContinueWhenAny() lugar de ContinueWith() . Ver here


Mi mejor idea hasta ahora es encadenar la creación de la nueva tarea de escritura, luego usar el método de extensión Unwrap para convertir la Task<Task> nuevamente en Task :

public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask) { return precedingTask.ContinueWith(x => CreateWriteTask(stream, data)).Unwrap(); }


Por lo que yo entiendo, esta es una consecuencia desafortunada de no tener control sobre cuándo comienza una tarea. Como nunca se sabe cuándo se inicia una tarea, no puede haber una sobrecarga como

precedingTask.ContinueWith(Task nextTask)

porque una vez creado, es posible que ya se haya iniciado cuando llegue a ''Continuar con''. Además, también haría un lío de tipos. ¿Cuál debería ser el tipo aquí?

precedingTask<T>.ContinueWith(Task<..what?..> nextTask)

precedente devuelve una T, así que a continuación toma qué y devuelve qué? :) Esto podría ser resuelto con cierres sin embargo.