Non in grado di aggiornare interfaccia utente, dopo l'attività in background di completamento nel mio ASP.NET applicazione

0

Domanda

Io sono in esecuzione di una funzione con esecuzione prolungata come attività in background nel mio asp.net applicazione. Prima del termine dell'operazione il thread principale uscite (voglio che sia così, perchè se io uso la parola chiave in attesa e rendere il thread principale aspettare fino a sfondo termine dell'operazione, ho il proxy con il messaggio di errore

Errore Di Proxy
Il proxy server ha ricevuto una risposta non valida dal monte del server, dato che il compito di sfondo è troppo lungo

Ma una volta, dopo il completamento del compito, né sono in grado di aggiornare la pagina reindirizzando alla pagina stessa o nè sono in grado di modificare l'interfaccia utente. C'è qualche modo per aggiornare UI dopo il thread termina l'esecuzione.

Il mio codice va come questa:

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;
}

Sopra async task attende il metodo seguito, che è presente in un'altra classe.

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

Dopo questo metodo completa il controllo torna effettua per ImportThread() ma il codice scritto per eseguire l'override di UI non è l'aggiornamento dell'interfaccia utente. Ho bisogno di aggiornare la UI con lo stato di importazione. E anche da ImportThread il controllo non è tornando all'evento click del pulsante metodo di troppo.

Please help me con l'aggiornamento UI lo stato di importazione.

Nota: ho provato ad utilizzare Redirect.Response in ImportThread() per aggiornare la pagina, ma che non ha funzionato

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

Migliore risposta

1

Il tuo problema è che devi afferrare e comprendere la pagina web del ciclo di vita qui.

Hai questo caso in cui la pagina web è seduto sul desktop degli utenti:

enter image description here

Ora dire che l'utente fa clic su un pulsante.

Ora hai questo:

 var task = ImportThread();

    if (task.IsCompleted)

Ok, in modo che la pagina web è sul server. Si può mettere anche in asincrono aspetta fino a quando le mucche tornare a casa, ma è ANCORA QUESTO:

enter image description here

Così come lungo come il codice viene eseguito, o in attesa, la pagina web è ANCORA BLOCCATO sul lato server. SOLO fino a quando il codice di completa ed esce la pagina di viaggio giù per il lato client.

Di NUOVO: Il codice dietro non può arrestarsi, e non può attendere per qualcosa che alla fine, perché, se lo fa, allora la pagina RIMANE sul server fino a trattamento finito.

ALLORA E SOLO ALLORA la pagina web di fare il viaggio di ritorno verso il lato client. Questo, quindi, si verifica;

enter image description here

E poi LATO SERVER PAGINA È GETTATO FUORI della memoria, e tutte le variabili di classe sono DISTRUTTA!!! Il server web è ora in attesa per QUALSIASI UTENTE di post indietro di una pagina per l'elaborazione!!

Quindi, se avete bisogno di eseguire un qualche tipo di un lungo processo in esecuzione?

Hai poche scelte:

post della pagina, il codice dietro corre, codice dietro inizia un NUOVO thread, pagina web rende il viaggio di ritorno verso il lato client. A quel punto, avete bisogno di un timer + qualche tipo di metodo di web call (ajax) per sondaggio o chiedere al server se il lungo processo in esecuzione è fatto. E poiché una chiamata ajax NON hanno l'uso di qualsiasi web di controlli su quella pagina, o pagina di variabili di classe (ricordate, DOPO la pagina web viaggia in giù, indietro, di lato client, la pagina web NON è NON ESISTENTE web lato server in memoria, né una QUALSIASI delle variabili di classe esistenti). Quindi, di nuovo, ciò significa che un qualche tipo di timer, o come è noto, un timer + codice per chiamare alcuni ajax metodo. e quel lungo processo in esecuzione dovrà MOLTO probabilmente di sessione() dal momento che non hanno l'uso di controlli, o anche ViewState.

E non è necessario utilizzare una chiamata ajax. È possibile utilizzare un semplice JavaScript lato client di routine, con un timer che dire fa clic su un pulsante ogni 1 o 2 secondi, il codice viene eseguito, e poi avrebbe dovuto ottenere lo status di quel lungo processo in esecuzione (di nuovo, probabilmente, dalla sessione), e quindi aggiornare la visualizzazione. E quindi si potrebbe anche includere il codice per interrompere il timer quando lo stato è impostato su "fatto" o qualsiasi altra cosa.

In modo che il codice dietro non e non "aggiornare" la pagina web più volte. Si dispone di UNO di andata e ritorno, e il codice che sta dietro deve correre veloce, deve finire, e non può anche utilizzare un ATTENDONO di comando, da allora la pagina si STLL aspettare, e ANCORA bloccato sul server.

Se si vuole andare oltre la semplice timer trucco approccio - che spesso uso?

Quindi è necessario adottare e introdurre nel vostro sito web qualcosa di progettato per questo tipo di caso -

Per fortuna, c'è signalR per questo scopo, e che senza dubbio l'opzione migliore e l'approccio per voi, dal momento che è stato progettato per fare esattamente la tua domanda e di scenario.

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

Se si desidera in modo asincrono la notifica di un utente (di completamento o il fallimento di qualsiasi cosa come un compito), è possibile utilizzare web di notifica push (utilizzando firebase di messaggistica cloud) o SignalR prese. Quando si utilizza un'attività in background si perde il filo principale e, purtroppo, non c'è modo di rispondere ai relativi manuali.

2021-11-23 20:31:11

In altre lingue

Questa pagina è in altre lingue

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