Diskuze: Probuzení spícího vlákna C#
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zapomeň na vlákna
C# má mnohem lepší nástroje- třeba Timer resp. DispatcherTimer ve wpf
Když vidím :
Thread.Sleep(60000);
Jdou na mně mdloby
No a z toho timeru můžeš pak spustit Backgroundworker, nebo Task - ty pak
můžeš taky volat odkud chceš
Souhlasím s tím co napsal ostrozan, ale pokud by jsi chtěl trvat na svém řešení, tak by se to dalo udělat například takto:
private Thread t;
private void ZahajeniKontroly()
{
t = new Thread(new ThreadStart(ZkontrolujData));
t.Start();
}
private void ProvedKontrolu()
{
if(!probiha_provadeni_kontroly)ProvadeniKontroly();
}
private bool probiha_provadeni_kontroly = false;
private void ZkontrolujData()
{
while (true)
{
if(!probiha_provadeni_kontroly)ProvadeniKontroly();
Thread.Sleep(60000);
}
}
private void ProvadeniKontroly()
{
probiha_provadeni_kontroly = true;
// Inicializace dat pro kontrolu ( pokud to bude nutné zde )
// Provádění kontroly
probiha_provadeni_kontroly = false;
}
V tomto případě pokud bych zavolal metodu ProvedKontrolu by se metoda ProvadeniKontroly nevolala ve vedlejším vlákně. Vyrábět kvůli tomu nové vlákno bych nechtěl, zkusím to tím druhým způsobem, ale děkuji.
Pokud bych ale každou minutu vytvářel nový Backgroundworker, tak nebude to moc časově/procesorově náročné? Je možné, že by se třeba ta kontrola prováděla i každých 10sekund.
Aha, ono stačí vytvořit jen jeden BackgroundWorker a jen ho zapínat, já jsem si myslel, že když se provede událost .RunWorkerCompleted, že dojde k úplnému uvolnění zdrojů a nejde dál používat.
Hodně záleží, co ta tvoje kontrola vlastně dělá - jak je časově náročná
Pokud bych ale každou minutu vytvářel nový Backgroundworker, tak nebude to moc časově/procesorově náročné?
naopak já si myslím, že je zbytečné ho držet v paměti celou dobu, když ho potřebuješ jednou za minutu - odhaduju na pár milisekund
To není úplně jednoznačné jak často se ta kontrola bude provádět. Je to někde mezi 5s až 1min. Ta kontrola spočívá pouze v serealizaci dat a jejich odeslani. Časově to vychází kolem 10ms. Myslíš, že kdybych ho potřeboval využívat třeba i těch každých 5s, že bude lepší si ho vytvořit vždy nový a v události .RunWorkerCompleted si ho Disposovat?
10 ms bych vůbec neřešil asynchronní operací
pokud to potřebuješ dělat periodicky , tak použij ten timer a spouštěj to
na událost Tick - a pak vždy kdy budeš potřebovat.
pokud to ale chceš mermomocí spouštět asynchronně - použij spíš ten Task - způsobů jak ho použít je víc - tady je takové shrnutí
BackgroundWorker je asi v tvém případě zbytečný - je to takový relikt starých časů - a možná, kdyby bývali přišli s Taskem dříve, tak by asi ani nevznikl
a k tvé poslední otázce - všeobecně pro jakýkoliv objekt - i 5 sekund je v počítačovém čase strašně dlouhá doba a je zbytečné ho tam držet, kvůli použití na 10 ms
Zobrazeno 9 zpráv z 9.