Me gustaría saber si hay una manera en ASP.NET C# para mostrar de alguna manera al usuario que el trabajo aún continúa mientras se ejecuta algo que tarda años en finalizar.
Déjame explicarte un poco más con algo de código. Primero tengo una página ASPX que muestra algunos elementos de carga de archivos y un botón para enviar el formulario al servidor. Le permite al usuario enviar 3 archivos diferentes que se procesan de manera diferente:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="MassUpdates.aspx.cs" Inherits="MassUpdates" %> <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> <h3 style="font: bold;">Mass Updates</h3> <hr /> <div class="row"> <div class="col-12 mb-2"> <asp:Label ID="Label0" runat="server" Text="File 1 : "></asp:Label> <asp:FileUpload ID="fup1" runat="server" /> </div> <div class="col-12 mt-2 mb-2"> <asp:Label ID="Label1" runat="server" Text="File 2 : "></asp:Label> <asp:FileUpload ID="fup2" runat="server" /> </div> <div class="col-12 mt-2 mb-2"> <asp:Label ID="Label2" runat="server" Text="File 3 : "></asp:Label> <asp:FileUpload ID="fup3" runat="server" /> </div> </div> <div class="row"> <div class="col-12 mt-2"> <asp:Button ID="btnEnvoi" runat="server" Text="Envoyer" OnClick="btnEnvoi_Click" /> </div> <div class="col-12 mt-2"> <asp:Label ID="lblMsg" runat="server" Text="" Visible="false"></asp:Label> </div> </div> </asp:Content>Luego, en el código detrás de la página, tengo una pequeña función llamada cuando el usuario presiona el botón que llama a cada proceso de archivo si el archivo se ha soltado:
protected void btnSend_Click(object sender, EventArgs e) { if (fup1.HasFiles) { result += trtFile1(); // Return a string that give the final feedback of the execution for File 1 } if (fup2.HasFiles) { result += trtFile2(); // Return a string that give the final feedback of the execution for File 2 } if (fup3.HasFiles) { result += trtFile3(); // Return a string that give the final feedback of the execution for File 3 } lblMsg.Text = result; }Pero como dije antes, si el usuario envía 3 archivos enormes, hacer todo el proceso lleva años (es una imagen) y se preguntan si la aplicación se bloqueó o aún se está ejecutando.
Lo que quiero saber es si hay una manera de enviar a la página del lado del cliente alguna información (como un texto o un valor para establecer en una barra de progreso) cuando llegamos a un paso en la función. Algo como eso :
protected void btnSend_Click(object sender, EventArgs e) { if (fup1.HasFiles) { // Send to the client that we start file 1 result += trtFile1(); // Return a string that give the final feedback of the execution for File 1 } if (fup2.HasFiles) { // Send to the client that we start file 2 result += trtFile2(); // Return a string that give the final feedback of the execution for File 2 } if (fup3.HasFiles) { // Send to the client that we start file 3 result += trtFile3(); // Return a string that give the final feedback of the execution for File 3 } lblMsg.Text = result; }¡Gracias si alguno de ustedes ya escuchó sobre este tipo de funcionalidad o tiene algo similar en su bolsillo!
Rolstyam.
La forma en que he hecho cosas como esta es:
No tengo idea de si esta es la forma "correcta" de hacerlo, solo que funcionó lo suficientemente bien para mi propósito, es decir, un backend de aplicación que realiza un trabajo intensivo de procesamiento. Si hay una mejor manera, espero que alguien la publique. No sé qué tan aplicable es si la descarga de datos es el principal cuello de botella, ni qué tan difícil sería usarlo para una página web.