Nu a reușit să actualizare UI fundal după finalizarea sarcinii în ASP.NET cerere

0

Problema

Sunt rulează un timp de funcționare funcționa ca sarcină de fundal în asp.net aplicație. Inainte de sarcina completeaza firul principal ieșirile (că așa vreau eu numai, deoarece dacă am folosi așteaptă de cuvinte cheie și de a face firul principal, așteptați până sarcină de fundal completeaza, am proxy de eroare cu mesajul

Proxy De Eroare
Proxy server a primit un răspuns invalid din amonte, server de fundal sarcina este prea lung

Dar o dată după finalizarea sarcinii nici nu sunt în măsură să reîmprospătați pagina prin redirecționarea la aceeași pagină sau nici nu sunt capabil să suprascrie UI. Există vreo modalitate de a actualiza UI după firul principal completeaza execuție.

Codul meu merge ca aceasta:

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

Cele de mai sus asincron sarcina așteaptă metoda de mai jos, care este prezent într-o altă clasă.

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

După această metodă se completează de control se întoarcă cu spatele la ImportThread() dar codul scris acolo pentru a suprascrie UI nu este actualizarea UI. Am nevoie pentru a actualiza UI cu statut de import. Și, de asemenea, de la ImportThread de control nu este de gând înapoi să faceți clic pe butonul eveniment metoda prea.

Va rog ajutati-ma cu orice mod de a actualiza UI starea de import.

Notă: am încercat, folosind Redirect.Response în ImportThread() pentru a actualiza pagina, dar nu a mers

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

Cel mai bun răspuns

1

Problema ta este că trebuie să înțeleagă și prin pagina web a ciclului de viață aici.

Aveți acest caz în care pagina web este așezat pe utilizatorii de desktop:

enter image description here

Acum spune utilizatorul face clic pe un buton.

Acum ai aceasta:

 var task = ImportThread();

    if (task.IsCompleted)

Ok, așa că pagina de web este pe server. Puteți pune chiar și asincron așteaptă până la vacile vin acasă, dar ÎNCĂ mai AU ACEST lucru:

enter image description here

Deci, atâta timp cât codul se execută, sau așteaptă, pagina web este ÎNCĂ BLOCAT pe partea de server. NUMAI până completeaza codul și ieșirile are o pagină de călătorie în jos la partea de client.

Din NOU: Codul spatele nu se poate opri, și nu pot să aștept pentru ceva pentru a termina, deoarece dacă o face, atunci pagina RĂMÂNE pe server pana prelucrare a terminat.

ATUNCI ȘI DOAR ATUNCI pagină web face călătoria înapoi în jos la partea de client. Acest lucru apare atunci;

enter image description here

Și apoi pe PARTEA de SERVER PAGINĂ ESTE ARUNCAT AFARĂ de memorie, și toate variabilele de clasă sunt DISTRUSE!!! Serverul de web este acum în așteptare pentru ORICE UTILIZATOR pentru a posta înapoi o pagină pentru prelucrarea!!

Deci, dacă aveți nevoie pentru a rula un fel de lung proces care rulează?

Aveți câteva opțiuni:

post de pe pagina, cod spatele ruleaza, cod spatele începe un subiect NOU, pagina web face călătoria înapoi la partea de client. În acel moment, ai nevoie de un cronometru + un anumit tip de web apel de metodă (ajax) pentru a interoga sau de a cere serverului dacă lungă de funcționare proces este terminat. Și când un apel ajax NU trebuie utilizat de orice controale web de pe pagină, sau pagina de variabile de clasă (amintiți-vă, DUPĂ pagină web călătorește în jos înapoi la partea de client, pagina web nu este NU este EXISTENT web pe partea de server în memorie, și nici nu este de variabile de clasa existente). Deci, din nou, acest lucru destul de mult înseamnă un fel de cronometru, sau după cum sa menționat, un timer + cod pentru a apela unele metoda ajax. și că mult timp în procesul de funcționare va trebui să FOARTE probabil utilizare sesiune (), deoarece nu trebuie utilizat de control, sau chiar ViewState.

Și nu este necesar să utilizați un apel ajax. Ai putea folosi un simplu JavaScript pe partea de client de rutină cu un timer care spun clicuri de un buton la fiecare 1 sau 2 secunde, codul din spatele fuge, și ar trebui apoi pentru a obține statutul de care de mult procesul de funcționare (din nou, probabil din sesiune), și apoi a actualiza afișarea. Și atunci ai putea, de asemenea, include cod pentru a opri cronometrul atunci când starea s-a schimbat pentru a "făcut" sau orice altceva.

Deci codul spatele nu are și nu va "actualizare" pagina web de mai multe ori. Aveți O călătorie dus-întors, și codul din spatele trebuie să ruleze rapid, trebuie să termin de funcționare, și nu poate folosi chiar și o AȘTEAPTĂ comanda, atunci pagina va STLL stai, și să fie în CONTINUARE blocat pe server.

Dacă vrei să mergi dincolo de cronometru simplu truc de abordare - care de multe ori am folosi?

Apoi, aveți nevoie pentru a adopta și de a introduce în site-ul web ceva concepute pentru acest tip de caz -

Din fericire, există signalR pentru acest scop, și care, fără îndoială, cea mai bună opțiune și abordare pentru tine, deoarece este conceput pentru exact intrebarea ta și scenariu.

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

Dacă doriți să asincron notifica un utilizator (de completare sau eșecul de ceva, cum ar fi o sarcina), puteți utiliza web de notificare împinge (folosind baza de mesagerie nor) sau SignalR prize. Atunci când utilizați un fundal sarcina pierzi firul principal și, din păcate, nu există nici o modalitate de a răspunde la cele legate de utilizator.

2021-11-23 20:31:11

În alte limbi

Această pagină este în alte limbi

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