Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 30% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se PHP
Discount week - April - 30

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

Aktivity (5)
Avatar
Adam Gajdečka:5. dubna 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. dubna 19:12
 
Odpovědět
5. dubna 19:12
Avatar
Adam Gajdečka:6. dubna 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. dubna 23:04
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
JerryM
Člen
Avatar
JerryM:Včera 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
Včera 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.