Pasando una tarea como parámetro

No estoy seguro de si esto es posible, así que aquí está:

Tengo una secuencia de acción para realizar múltiples

async Task MethodA(...) { // some code // a call to specific Async IO bound method // some code } 

también hay MethodB() , MethodC() , etc., y todos tienen exactamente el mismo código, excepto la llamada a un método específico de E / S asíncrono enlazado. Estoy tratando de encontrar una manera de pasar un puntero de tarea a un método, para que podamos ejecutarlo más tarde en un Método ().

Lo que estoy haciendo actualmente es esto:

 private async Task Method(Func<Task> func) { // some code var a = await task.Run(func); // some code } var task = async () => await CallToIOBoundTask(params); Method(task); 

Este código, sin embargo, extrae un nuevo hilo cada vez, lo que no es necesario para la tarea vinculada a IO y debe evitarse.

Entonces, ¿hay una manera de refactorizar el código para que no se use ningún hilo ThreadPool? Un objective es tener un código como este:

 private async Task Method(Task task) { // some code var a = await task; // some code } 

También es importante mencionar que las diferentes llamadas de IO tienen diferentes firmas de métodos. Además, una tarea puede comenzar a ejecutarse solo en el cuerpo del Method() , y no antes.

Por supuesto, simplemente invoque la func , recupere una tarea y await :

 async Task Method(Func> func) { // some code var a = await func(); // some code } 

Además, cuando estás enviando esa expresión lambda, ya que todo lo que está haciendo es llamar a un método async que en sí mismo devuelve una tarea, no necesita ser async en sí mismo:

 Method(() => CallToIOBoundTask(params)); 

Eso está bien siempre y cuando todas estas llamadas devuelvan la Task . De lo contrario, solo puede usar la Task (lo que significa iniciar la operación y esperar su finalización) y no podrá usar el resultado.