Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
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í.
BF extended 2022

Diskuze: Nekonecna smycka - Increase CPU Usage

Aktivity
Avatar
Petr Vít
Člen
Avatar
Petr Vít:27.3.2018 21:36

Zdravím,

v programu mám nekonečnou smyčku while (lze ji prerusit druhym tlacitkem), která je v async metode s prikazem:

await Task.Delay(1000);

Tím pádem je využití procesoru na 0.x %. Avšak postupem času když smyčka běží,cca po 1 hodině se využití navýší na jednotky procent a poté už desítky.

Víte někdo kde může být chyba?
Díky

 
Odpovědět
27.3.2018 21:36
Avatar
Marian Benčat:27.3.2018 22:35

Hmm,.. Možná za to může scheduler Win 10. Těžko říci.. Obecně.. Tašky co nevyuziji celý prideleny čas (časové quantum) CPU se dostávají na radu víc často,.. (To je jedna ze strategii). Nevím ale jak konkrétně ve win se počítá využití CPU, mel jsem za to, ze na základě toho jak velké quantum proces dostává a kolik využije.

Nahoru Odpovědět
27.3.2018 22:35
Totalitní admini..
Avatar
Marian Benčat:27.3.2018 22:43

Oj, to je task.delay, ne thread sleep ;) no tak to bude tvůj problém :) hod větší kus kódu.. Nevím, jestli vis jak task.delay funguje?

Nahoru Odpovědět
27.3.2018 22:43
Totalitní admini..
Avatar
Petr Vít
Člen
Avatar
Petr Vít:28.3.2018 9:22

To nevím.

Task delay jsem pridal po rade zkusenejsich tady na foru. Protože bez něho bylo vytížení procesoru na vysokých číslech hned po spuštení.

Tady delší část kódu

public async void SeH(double StartPrice)
       {
           double Bid = (mainWindow.apiclient.SymbolInfoTick("GOLD")).Bid;
           mainWindow.textbox.Text += Bid + "\r\n";
           mainWindow.textbox.Text += StartPrice + "\r\n";

           if (SellAllowed && Bid < StartPrice)
           {
               if (CheckSellStop())
               {
                   Prvni(Bid);
                   Druha(Bid);
                   Treti(Bid);
                   Ctvrta(Bid);
                   Pata(Bid);
                   Sesta(Bid);
               }
           }



           while (SellAllowed && Bid < StartPrice)
           {
               Bid = (mainWindow.apiclient.SymbolInfoTick("GOLD")).Bid;
               CheckAny352();
               await Task.Delay(1000);
               GC.Collect();
           }


       }
 
Nahoru Odpovědět
28.3.2018 9:22
Avatar
Odpovídá na Petr Vít
Marian Benčat:28.3.2018 11:42

O bože :-) kdo ti poradil to GC.Collect() v každé iteraci toho whileu?? To je pěkná sračka. V životě nešahej na garbage collector, pokud nemáš nejmenší tušení jak funguje.

Editováno 28.3.2018 11:43
Nahoru Odpovědět
28.3.2018 11:42
Totalitní admini..
Avatar
Petr Vít
Člen
Avatar
Petr Vít:28.3.2018 12:46

To jsem tam přidal včera.....

Nějaké nápady jak zastavit zvyšující se zatížení procesoru?

Díky

 
Nahoru Odpovědět
28.3.2018 12:46
Avatar
Odpovídá na Petr Vít
Marian Benčat:31.3.2018 11:57

Prvni co udělej, tak zapomen na dlouhou dobu, že existuje nějaký GC, už jen tímto silene tlacis na CPU...

Nahoru Odpovědět
31.3.2018 11:57
Totalitní admini..
Avatar
pracansky
Člen
Avatar
Odpovídá na Petr Vít
pracansky:7.5.2018 18:09

zkus to spustit se sledováním CPU visual studio ti ukáže co žere nejvíc času. Jak je vidět na obrázku zde:
https://blogs.msdn.microsoft.com/…ion-details/
Možná je chyba někde úplně jinde. Async a await sice vypadá jako jednoduché řešení, ale pokud nevíš co se děje na pozadí může to být zrádné.
Zkontroluj třeba jestli se ta funkce nevolá současně víckrát než si myslíš.
To GC.Collect() bych tam nedával pokud k tomu nemáš vážný důvod ale na funkci to nemá vliv.

 
Nahoru Odpovědět
7.5.2018 18:09
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 8 zpráv z 8.