Estoy en el proceso de actualizar el código antiguo usando BackgroundWorker . Siguiendo una serie de artículos de Stephen Cleary sobre este tema, creo que el sustituto ideal en este caso es Task.Run() .
La mía es una aplicación de Windows Forms. Cuando se construye un formulario, se inician diferentes operaciones en segundo plano y sus resultados se recopilan en diferentes controladores de eventos, según el patrón BackgroundWorker .
Ahora, mis nuevos métodos siguen el patrón async/await. Tengo algunas preocupaciones acerca de llamar a Task.Run() en métodos asincrónicos.
private async void FormEventHandler(object sender, EventArgs e) { Task.Run(async () => await AwaitableLongRunningTask_1()); Task.Run(async () => await AwaitableLongRunningTask_2()); //... }AwaitableLongRunningTask_1 y _2 deben ser asíncronos, ya que las llamadas que realizan dentro del cuerpo del método son métodos asíncronos.
No puedo llamarlos en una sucesión de espera simple:
private async void FormEventHandler(object sender, EventArgs e) { await AwaitableLongRunningTask_1(); await AwaitableLongRunningTask_2(); //... }ya que deben iniciarse en paralelo y obviamente son tareas de larga duración que duran varios segundos.
Entonces, mi pregunta es, ¿debo refactorizar AwaitableLongRunningTasks para que no sean asíncronas, cambiando su comportamiento interno como se sugiere aquí en "Cómo llamar al método asincrónico desde el método sincrónico" ? ¿Hay mejores opciones que me estoy perdiendo?
Utilice Task.WhenAll
private async void FormEventHandler(object sender, EventArgs e) { await Task.WhenAll( AwaitableLongRunningTask_1(), AwaitableLongRunningTask_2()); }