Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

153
Vistas
Enviar el estado actual de un proceso largo mientras se está ejecutando

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.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

La forma en que he hecho cosas como esta es:

  1. El cliente realiza una solicitud, incluido un Guid que sirve como clave para los informes de progreso
  2. El servidor comienza a procesar y actualiza periódicamente alguna estructura de datos compartidos con el progreso, utilizando el Guid como clave.
  3. El cliente usa un temporizador para sondear periódicamente el progreso del servidor, nuevamente usando el GUID como clave.
  4. Cuando el servidor completa el procesamiento, debe eliminar el GUID del almacenamiento compartido para evitar pérdidas de memoria.

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda