No se puede actualizar de fondo de la interfaz de usuario después de la terminación de la tarea en mi ASP.NET aplicación

0

Pregunta

Estoy ejecutando un tiempo de funcionamiento como tarea de fondo en mi asp.net aplicación. Antes de que la tarea se complete el hilo principal de las salidas (quiero que sea así, ya que si uso la palabra clave await y hacer hilo principal esperar hasta el fondo de la tarea completa, me da error de proxy con mensaje

Error De Proxy
El servidor proxy recibió una respuesta no válida de un servidor ascendente desde el fondo de la tarea es demasiado largo

Pero una vez después de la terminación de la tarea ni yo soy capaz de actualizar la página redirigir a la misma página o ni yo soy capaz de reemplazar la interfaz de usuario. Hay alguna forma de actualización de la interfaz de usuario después de que el hilo principal se completa su ejecución.

Mi código es este:

protected void btnImport_Click(object sender, EventArgs e)
{
        var task = ImportThread();

        if (task.IsCompleted)
        {
            DisplaySuccess("Import success");
        }
        else
            DisplayError("Import failed");
}

private async Task<bool> ImportThread()
{
        try
        {
            var success = await Task<bool>.Run(() => new Manager().Import().ConfigureAwait(false);

            if (task.IsCompleted)
            {
                DisplaySuccess("Import success");
            }
            else 
            {
                DisplayError("Import failed");
            }
    
            return true;
}

El de arriba async tarea le espera al método por debajo de la cual está presente en otra clase.

public bool Import()
{
    // some operations here
    return true;
}

Después de este método se completa el retorno del control de espaldas a ImportThread() pero el código escrito para anular la interfaz de usuario no es la actualización de la interfaz de usuario. Necesito actualizar la interfaz de usuario con el estado de importación. Y también de ImportThread el control no va a regresar a evento de clic de botón método también.

Por favor me ayudan con cualquier forma de actualización de la interfaz de usuario el estado de la importación.

Nota: he intentado utilizar Redirect.Response en ImportThread() para actualizar la página, pero que no funcionó

asp.net async-await background-task c#
2021-11-23 19:55:22
2

Mejor respuesta

1

Su problema es que usted tiene que agarrar y bajo el soporte de la página web del ciclo de vida de aquí.

Usted tiene este caso en el que la página web está sentado en el los usuarios de escritorio:

enter image description here

Ahora dicen que el usuario hace clic en un botón.

Ahora tienes esta:

 var task = ImportThread();

    if (task.IsCompleted)

Ok, así que la página web en el servidor. Usted puede poner en incluso async espera hasta que las vacas vienen casa, pero usted TODAVÍA TIENE ESTO:

enter image description here

Así que, mientras se ejecuta el código, o espera, la página web está TODAVÍA PEGADO en el lado del servidor. SÓLO hasta que el código se completa y no sale la página de viajes hacia el lado del cliente.

De NUEVO: El código detrás no se pueden detener, y no puede esperar para que algo acabado, ya que si lo hace, entonces la página se MANTIENE en el servidor hasta que el procesamiento terminado.

ENTONCES Y SÓLO ENTONCES la página web hacer el viaje de vuelta hacia el lado del cliente. Esto entonces se produce;

enter image description here

Y, a continuación, el SERVIDOR de la PÁGINA ES ARROJADO FUERA de la memoria, y todas las variables de clase son DESTRUIDOS!!! El servidor web está ahora a la espera de que CUALQUIER USUARIO publicar una página para el procesamiento!!

Por lo tanto, si usted necesita para ejecutar algún tipo de tiempo de funcionamiento del proceso?

Usted tiene algunas opciones:

post de la página, el código se ejecuta, el código se inicia un NUEVO hilo, en la página web hace que el viaje de vuelta para el lado del cliente. En ese punto, usted necesita un temporizador + algún tipo de llamada al método web (ajax) para sondeo o pedir al servidor si el largo proceso en ejecución se realiza. Y desde una llamada ajax NO tiene el uso de cualquier web de controles en esa página, o página de las variables de la clase (recordar, DESPUÉS de la página web de viajes de vuelta para el lado del cliente, la página web NO es NO EXISTENTE en la web de lado del servidor en la memoria, ni NINGUNA de las variables de clase existentes). Así que, de nuevo, esta bastante mucho significa algún tipo de temporizador, o como se señaló, un temporizador + código para llamar a algo de ajax método. y en ese largo proceso de ejecución tendrá MUY probable que el uso de la sesión() ya no tiene el uso de controles, o incluso ViewState.

Y no es necesario el uso de una llamada ajax. Usted podría utilizar un simple JavaScript del lado cliente de la rutina con un temporizador que decir hace clic en un botón cada 1 o 2 segundos, el código detrás de carreras, y entonces habría que obtener el estado de un largo proceso en ejecución (de nuevo, probablemente, de la sesión) y, a continuación, actualizar la pantalla. Y entonces también se puede incluir código para detener el temporizador cuando el estado ha cambiado a "hacer" o lo que sea.

Así que el código detrás no y no "actualización" de la página web varias veces. Usted tiene UN viaje ida y vuelta, y el código detrás debe correr rápido, debe finalizar su ejecución, y no puede incluso utilizar una AGUARDAN comando, desde luego la página se STLL esperar, y TODAVÍA quede atascado en el servidor.

Si quieres ir más allá de la simple temporizador truco enfoque que utilizo a menudo?

Entonces usted necesita para adoptar e introducir en su sitio web, algo diseñado para este tipo de caso -

Afortunadamente, hay signalR para este propósito, y que, sin duda, la mejor opción y el enfoque para usted, ya que está diseñada para exactamente su pregunta y escenario.

SignalR

https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/introduction-to-signalr#:~:text=What%20is%20SignalR%3F%20ASP.NET%20SignalR%20is%20a%20library,process%20of%20adding%20real-time%20web%20functionality%20to%20applications.

2021-11-23 21:28:35
0

Si usted desea de forma asincrónica notificar a un usuario (de éxito o fracaso de cualquier cosa, como una tarea), puede utilizar la web de la notificación de inserción (utilizando la base avanzada de mensajería en la nube) o SignalR sockets. Cuando se utiliza una tarea de fondo a perder el hilo principal y, por desgracia, no hay manera de responder a los relacionados con el usuario.

2021-11-23 20:31:11

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................