Nejsou schopni aktualizovat UI po pozadí dokončení úkolu v mém ASP.NET aplikace

0

Otázka

Jsem běží dlouhý běh funkce jako pozadí úkol v mém asp.net aplikace. Předtím, než úkol dokončí hlavní vlákno (já to tak chci pouze, protože když použiju čekají klíčové slovo, a aby hlavní vlákno počkat do pozadí úkol dokončí, jsem si proxy chyba se zprávou

Proxy Chyba
Server proxy obdržely neplatnou odpověď od nadřazeného serveru od pozadí úkol je příliš dlouhý

Ale jakmile po dokončení úkolu ani jsem schopen aktualizovat stránku tím, že přesměruje na stejnou stránku, nebo ani jedno jsem schopen přepsat UI. Existuje nějaký způsob, jak aktualizace uživatelského ROZHRANÍ po hlavní vlákno dokončí provedení.

Můj kód vypadá 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;
}

Výše asynchronní task čeká následující metodu, která je přítomna v jiné třídě.

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

Poté, co tato metoda dokončí kontrolu vrátit se zády k ImportThread() ale kód napsaný tam přepsat UI není aktualizace UI. Musím aktualizovat UI s status dovozu. A také z ImportThread ovládání není cesty zpět na tlačítka klepněte na událost metoda.

Prosím, pomozte mi s případnými způsob, jak aktualizovat UI status dovozu.

Poznámka: snažil jsem se pomocí Redirect.Response v ImportThread() pro obnovení stránky, ale to nefungovalo

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

Nejlepší odpověď

1

Váš problém je, že musíte pochopit, a za stát na webové stránce životního cyklu.

Máte tento případ, ve kterém webová stránka je sedět na uživatele počítače:

enter image description here

Teď říkají, že uživatel klepne na tlačítko.

Nyní máte toto:

 var task = ImportThread();

    if (task.IsCompleted)

Ok, takže webová stránka je na serveru. Můžete si dát i asynchronní čeká, dokud se krávy přijdou domů, ale STÁLE MÁTE TOTO:

enter image description here

Tak dlouho, jak váš kód běží, nebo čeká, webová stránka je STÁLE PŘILEPENÁ na straně serveru. JEN dokud kód dokončí a východy má stránka cestování na straně klienta.

ZNOVU: Váš kód nelze zastavit, a nemůže čekat, až se něco dokončit, protože pokud to dělá, pak stránka ZŮSTÁVÁ na serveru, dokud se zpracování hotové.

PAK A POUZE PAK se webové stránky udělat výlet zpátky dolů na straně klienta. To pak nastane;

enter image description here

A pak na STRANĚ SERVERU STRÁNKA JE VYHODIL z paměti, a všechny proměnné třídy jsou ZNIČENY!!! Webový server je nyní čeká na všechny UŽIVATELE, aby post zpět na stránku pro zpracování!!

Takže, pokud potřebujete spustit nějaký běžící proces?

Máte několik možností:

po stránce kódu za spouští, kód za spustí NOVÉ vlákno, webové stránky dělá výlet zpět na straně klienta. V tomto bodě, budete potřebovat časovač + nějaký typ webové volání metody (ajax) dotazování, nebo požádat server, pokud dlouho běžící proces je hotovo. A protože ajax volání nemusí používat jakékoliv webové ovládací prvky na této stránce, nebo stránce třídy proměnných (pamatujte, že PO stránce cestuje dolů zpět na straně klienta, webové stránky, NENÍ STÁVAJÍCÍ web na straně serveru v paměti, ani ŽÁDNÉ třídy proměnných stávající). Takže, opět, je to docela hodně znamená nějaký časovač, nebo jak je uvedeno, časovač + kód volat některé ajax metodou. a tak dlouho běžící proces bude muset VELMI pravděpodobně používat session (), protože nemusíte používat ovládací prvky, nebo dokonce ViewState.

A nebudete třeba muset použít ajax volání. Můžete použít jednoduchý JavaScript na straně klienta rutina s časovačem, které říkají, že klikne na tlačítko každou 1 nebo 2 sekundy, kód za spouští, a to by pak musel dostat do stavu, že dlouho běžící proces (opět pravděpodobně od relace), a pak aktualizovat zobrazení. A pak by také obsahovat kód k zastavení časovače, když se stav změnil na "hotovo" nebo cokoliv jiného.

Takže kód za sebou, není a nebude "update" na stránce vícekrát. Máte JEDNO kolo výlet, a že kód musí běžet rychle, musí dokončit běh, a nemůžu ani použít ČEKAJÍ na příkaz, od té stránce bude STLL dočkat, a být STÁLE přilepená na server.

Pokud chcete jít nad rámec jednoduché časovač trik přístupu, který jsem často používají?

Pak je třeba přijmout a zavést do své webové stránky určené pro tento typ případu -

Naštěstí, tam je signalR pro tento účel, a že není pochyb, že nejlepší možnost a přístup pro vás, protože je navržen přesně pro váš otázku a scénář.

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

Pokud chcete asynchronně informovat uživatele (dokončení nebo selhání něco jako úkol), můžete použít webové push oznámení (pomocí firebase cloud messaging) nebo SignalR zásuvky. Při použití úlohy na pozadí ztratíte hlavní vlákno a bohužel, není tam žádný způsob, jak reagovat na související uživatele.

2021-11-23 20:31:11

V jiných jazycích

Tato stránka je v jiných jazycích

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