Nie je schopný aktualizovať UI pozadí po dokončení úlohy v mojom ASP.NET aplikácia

0

Otázka

Ja som beží dlho beží funkciu ako pozadie úlohou v mojom asp.net aplikácie. Pred úlohu dokončí hlavné vlákno východov (chcem to tak len vtedy, ak používam čakajú kľúčové slovo a vytvoriť hlavné vlákno počkajte, až pozadí úlohu dokončí, mám proxy chyba správou

Proxy Chyba
Proxy server dostal neplatnú odpoveď z nadradeného servera od pozadia úlohou je príliš dlhé.

Ale raz po dokončení úlohy ani som schopný obnoviť stránku, presmerovanie na rovnakej stránke alebo ani som schopný prepísať UI. Existuje nejaký spôsob, ako aktualizovať UI po hlavnej vlákno dokončí exekúcie.

Môj kód vyzerá takto:

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

Vyššie async úloha čaká metóda nižšie ktorý je prítomný v inej triedy.

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

Po tejto metódy dokončí kontrolu vrátiť chrbtom sa ImportThread() ale kód napísaný tam prepísať UI nie je aktualizácia UI. Musím aktualizovať UI so stavom dovozu. A tiež z ImportThread ovládanie nie je cesta späť na tlačidlo udalosť, metódu, príliš.

Prosím, pomôžte mi so žiadnym spôsobom aktualizácie UI stav importovať.

Poznámka: snažil som sa pomocou Redirect.Response v ImportThread() ak chcete obnoviť stránku, ale to nefunguje

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

Najlepšiu odpoveď

1

Váš problém je, že budete musieť pochopiť a pod stojan na webovej stránke technickej tu.

Máte tento prípad, v ktorom webovej stránke sedí na užívateľov ploche:

enter image description here

Teraz hovoria, že používateľ klikne na tlačidlo.

Teraz máte túto:

 var task = ImportThread();

    if (task.IsCompleted)

Ok, takže web stránka je až na server. Môžete dať aj async čaká, kým kravy prísť domov, ale vy ste EŠTE TOTO:

enter image description here

Tak dlho, ako váš kód spustí, alebo čaká, webová stránka je STÁLE PRILEPENÉ na strane servera. LEN dovtedy, kým kód dokončí a východy sa na stránke cestovať dole na strane klienta.

OPÄŤ: Váš kód za nemôže zastaviť, a nemôže čakať na niečo dokončiť, pretože ak áno, potom strana ZOSTÁVA až na server, kým spracovanie skončil.

POTOM A LEN POTOM sa webovú stránku, aby cesta späť nadol na strane klienta. Tento potom sa vyskytuje;

enter image description here

A potom na STRANE SERVERA STRÁNKA JE vyhodil z pamäte, a všetky triedy premenné sú ZNIČENÉ!!! Webový server je teraz čaká na každý UŽÍVATEĽ post späť stránku na spracovanie!!

Takže, ak potrebujete spustiť nejaký dlhý beh procesu?

Máte niekoľko možností:

post stránky, kód pozadu beží, kód pozadu začína NOVÉ vlákno, web stránka robí výlet späť na strane klienta. V tomto bode, musíte časovač + nejaký druh web volania metód (ajax) na ankete, alebo sa opýtať na server, ak dlho beží proces prebieha. A keďže ajax volania nemá používať akékoľvek webové ovládacie prvky na tejto stránke, alebo na stránke triedy premenné (pamätajte, PO webovej stránke cestuje dolu späť na strane klienta, webové stránky NIE je NIE na EXISTUJÚCE web na strane servera v pamäti, ani sa VŠETKY triedy premenné existujúcich). Takže, ešte raz, tento pomerne veľa znamená nejaký časovač, alebo ako bolo uvedené, časovač + kód, ak chcete zavolať na niektoré ajax metóda. a že dlho beží proces sa bude musieť VEĽMI pravdepodobné, že použitie session (), pretože nemáte používanie ovládacích prvkov, alebo dokonca ViewState.

A nie je potrebné mať používať ajax volania. Môžete použiť jednoduchý JavaScript strane klienta rutinné s časovač, ktoré hovoria, klikne na tlačidlo každý 1 alebo 2 sekundy, kód za beží, a potom by sa museli dostať do stavu, že dlho beží proces (opäť pravdepodobne z relácie), a potom aktualizovať zobrazenie. A potom by ste mohli tiež obsahovať kód, ak chcete zastaviť odpočítavanie, keď stav sa zmení na "hotovo" alebo čokoľvek iné.

Takže kód pozadu nie je a nebude "update" na webovej stránke viackrát. Máte JEDEN spiatočný, a kód pozadu, musí rýchlo bežať, musí dokončiť beží, a nemôže sa použiť aj ČAKAJÚ na povel, pretože potom bude stránka STLL čakať, a EŠTE byť prilepené na server.

Ak chcete ísť nad rámec jednoduchý časovač trik prístup, v ktorej som sa často používajú?

Potom budete musieť prijať a zaviesť do vašej web stránky niečo navrhnuté pre tento typ prípade -

Našťastie, tam je signalR na tento účel, a to bezpochyby najlepšou voľbou a prístup pre vás, pretože je určený presne pre vaše otázky a scenár.

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

Ak chcete asynchrónne upozorniť používateľa (dokončenie alebo neúspechu niečo také ako úlohu), môžete použiť webové push notifikácie (pomocou firebase správy cloud) alebo SignalR zásuvky. Pri použití pozadia úlohou stratíte hlavné vlákno a bohužiaľ, nie je tam žiadny spôsob, ako reagovať na súvisiace používateľa.

2021-11-23 20:31:11

V iných jazykoch

Táto stránka je v iných jazykoch

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