IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: .NET Core - zpracování požadavků u příspěvků

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Adam Gajdečka:5.4.2021 19:12

Ahoj, mám aplikaci s tabulkou Posts, která obsahuje sloupečky

Id | Title | PendingToUplo­adFacebook | PendingToUplo­adInstagram | PendingToUplo­adTwitter

Uživatel vytvoří příspěvek, zaklikne, že chce jej nahrát na FB, IG a TW. Uloží se to do databáze. V tu chvíli je potřeba, aby to nějaký backgroundService zpracoval, tedy nahrál na zmíněné sítě.

Problémem je, že těchto příspěvků může být celá řada, takže k nahrání bude třeba desítky v jednu chvíli a když vytvořím BackgroundService, tak po dokončení nahrání potřebuji tuto akci reflektovat v db, takže chci nastavit PendingToUplo­adFacebook = false;

Vytvořil jsem si 3 BackgroundServices. Tedy UploadFacebook­Service.cs, UploadInstagram­Service.cs, UploadTwitter­Service.cs.
Každá zpracovává příspěvky, které je potřeba nahrát na danou síť.

Bohužel v jednu chvíli je zpracován stejný Post více background services a při uložení dojde k chybě v datech. Takže se spustí dejme tomu FB, IG. Uloží se PendingToUplo­adFacebook = false, jenže v tu chvíli už PendingToUplo­adInstragram = true, ale tento proces o tom neví, takže uloží staré data.

Vím, že problém je v tom, že k databázi se vždy přistupuje přes nový scope. Problém nastává i v situaci, kdy běží ProcessUpload­Facebook() a uživatel během toho upraví například Title a pak tyto změny jsou ztraceny, protože po dokončení se přepíšou původními hodnotami, které dostal ten BackgroundService.

Používám MSSQL, EntityFramework. Zkoušel jsem před uložením dat volat, abych dostal původní data, upravil a uložil, ale nefunguje to. Díky všem za pomoc.

public void Reload(TEntity entity)
       {
           context.Entry(entity).Reload();
       }

Zkusil jsem:

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
       {
           await Task.Yield();
           while (!stoppingToken.IsCancellationRequested)
           {
               bool networkUp = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
               if (networkUp)
               {
                   using (var scope = Services.CreateScope()) //toto je problém, protože během toho co běží metoda níže, se změní data z jiného scopes
                   {
                       var _postManager = scope.ServiceProvider.GetRequiredService<IPostManager>();

                       _postManager.ProcessUploadFacebook(); //v teto metode dochazi i k update řádku v databázi
                   }
                   await Task.Delay(TimeSpan.FromSeconds(5));
               }
           }
       }
Editováno 5.4.2021 19:12
 
Odpovědět
5.4.2021 19:12
Avatar
Adam Gajdečka:6.4.2021 23:04

Tak jsem to asi vyřešil jedním BackgroundService a tam se spustí odpovídající metoda a spustí se upload více posts paralelně. Uvidím, zda to bude fungovat

 
Nahoru Odpovědět
6.4.2021 23:04
Avatar
JerryM
Člen
Avatar
JerryM:17.4.2021 14:08

to co chceš se dělá pomocí tzv. Windows Service
https://www.c-sharpcorner.com/…-in-c-sharp/
musíš si ji naprogramovat a spustit a této službě pak předáváš ze svého programu
instrukce a ona je zasílá dál
se službou se komunikuje pomocí WCF (nový .NET5/6 i starý)
http://wcftutorial.net/…_Part01.aspx
nebo pomocí knihovny RPC což je náhražka WCF pro .NET core
https://unwcf.com/…wcf-vs-grpc/
https://grpc.io/…ntroduction/
a tady je komunikace
https://stackoverflow.com/…-through-wcf
nicméně WCF už někdo propsal do .NET core (.NET5/6) a je na Giothubu takže muže používat i starou WCF...
no neni to nic jednoduchýho ale příkladu na netu je spousta

 
Nahoru Odpovědět
17.4.2021 14:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.