es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo mostrar la ejecución de cada tarea paralela de forma independiente en Blazor WASM.

Descripción:

Hay una página que debe mostrar resultados de dos operaciones asincrónicas independientes, por ejemplo, solicitudes REST.

Para mostrar el resultado de la primera tarea (haciendo solicitudes a través de los métodos del ciclo de vida de Blazor), debemos esperar la ejecución de ambas tareas, a pesar de que los datos de la primera tarea son obtenidos por el servicio.

Pregunta:

¿Cómo mostrar el resultado de la primera tarea sin esperar la ejecución de la segunda tarea?

Considera este código como ejemplo.

Los resultados de la primera tarea solo se mostrarán en la página después de la ejecución de la segunda tarea.

Servicio

public class TaskService : ITaskService
{
public async Task<string> FirstTask()
{
const int timeOut = 500;
await Task.Delay(timeOut);
Console.WriteLine(timeOut);
return nameof(FirstTask) + timeOut;
}
public async Task<string> SecondTask()
{
const int timeOut = 2500;
await Task.Delay(timeOut);
Console.WriteLine(timeOut);
return nameof(SecondTask) + timeOut;
}
}

Página

@page "/task-test"
@inject ITaskService _taskService</p>

<p><h3>TaskTest</h3></p>

<p><p>Primera tarea: @<em>firstString</p>
<p>Segunda tarea: @</em>secondString</p></p>

<p>@code {
    private string _firstString = "Valor inicial";
    private string _secondString = "Valor inicial";</p>

<pre><code>protected override async Task OnInitializedAsync()
{
    var firstTask = _taskService.FirstTask();
    var secondTask = _taskService.SecondTask();

    await Task.WhenAll(firstTask, secondTask);
    _firstString = firstTask.Result;
    _secondString = secondTask.Result;
}
</code></pre>

<p>}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Lamentablemente, no es posible mostrar el resultado de la primera tarea sin esperar la ejecución de la segunda tarea. Esto se debe a que la línea await Task.WhenAll(firstTask, secondTask) en el método OnInitializedAsync garantiza que ambas tareas se completen antes de continuar con el resto del método.

    Si se elimina la línea await Task.WhenAll, la página mostrará el “Valor de inicio” tanto para _firstString como para _secondString, y luego se actualizará eventualmente con los resultados de cada tarea tan pronto como se completen. Sin embargo, este no es el comportamiento deseado, ya que la página solo debe actualizarse cuando ambas tareas se completen.

    Si realmente necesita mostrar el resultado de la primera tarea sin esperar a que la segunda tarea se complete, podría considerar refactorizar su código para tener dos páginas separadas, cada una responsable de mostrar el resultado de una tarea. De esta manera, cada página puede hacer su propia solicitud independiente al servidor y mostrar el resultado tan pronto como esté listo. Sin embargo, esto requeriría un rediseño del flujo de su aplicación y puede que no sea la mejor solución para su caso de uso.

Comments are closed.