tag:blogger.com,1999:blog-364616448054212690.post1778968075771487296..comments2024-02-03T14:06:15.407+01:00Comments on Michał Komorowski: Jak zagłodzić Timer?Michał Komorowskihttp://www.blogger.com/profile/05521807053068126888noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-364616448054212690.post-48974659799068577662011-02-28T19:06:37.379+01:002011-02-28T19:06:37.379+01:00Po pierwszym przyjrzeniu się biblioteka Quartz.NE...Po pierwszym przyjrzeniu się biblioteka Quartz.NET wygląda na ciekawą ale nie zgodzę się z tym, że rozwiązuje problem. Na podstawie kodu z tutoriala przeprowadziłem szybki test. Stworzyłem triggera odpalającego joba co sekundę (odpowiednik Timera) oraz kilka innych triggerów odpalających długotrwające zadania. Zagłodzenie wystąpiło tak samo jak przy użyciu TPL czy ThreadPool.<br /><br />Uważam, że istota problemu tkwi w użyciu jakiejś puli wątków, a nie w tym czy jest to pola z biblioteki Quarz.NET czy ThreadPool. Jeśli mamy ograniczoną liczbę zasobów (w tym wypadku wątków) to zawsze może dojść do zagłodzenia. Aby się przed tym zabezpieczyć krytyczne czynności powinny korzystać z innych wątków niż te z puli albo na odwrót.Michał Komorowskihttps://www.blogger.com/profile/05521807053068126888noreply@blogger.comtag:blogger.com,1999:blog-364616448054212690.post-69954622210086912842011-02-28T18:51:44.645+01:002011-02-28T18:51:44.645+01:00@Tomasz Wójcik
Co do Task Parallel Library to ocz...@Tomasz Wójcik<br /><br />Co do Task Parallel Library to oczywiście masz rację. Mój błąd. W swoim teście ustawiłem maksymalną liczbę wątków na 10 i uruchomiłem 10 zadań ale zapomniałem o tym, że TPL potrafi dodatkowo wykorzystać główny wątek aplikacji i stąd mój błędy wniosek. A więc zagłodzenia timera nastąpi już przy uruchomieniu 11 zadań, a nie 100!Michał Komorowskihttps://www.blogger.com/profile/05521807053068126888noreply@blogger.comtag:blogger.com,1999:blog-364616448054212690.post-63072941570524405872011-02-28T10:02:13.826+01:002011-02-28T10:02:13.826+01:00Z TPL zagłodzenie też by wystąpiło - pod spodem TP...Z TPL zagłodzenie też by wystąpiło - pod spodem TPL też wykorzystuje wątki z puli wątków (ThreadPool) do fizycznego wykonywania tasków, łatwo to spreparować - zamiast for użyj Parallel.For, ale z większym ograniczeniem - np. 100 zamiast 10 (żeby taski z popartycjonowanymi danymi zapchały ThreadPool) lub Task.Factory.StartNew zamiast ThreadPool.QueueUserWorkItem i uzyskasz ten sam efekt. Dodatkowo możesz w t_Elapsed wypisywać ilość dostępnych wątków w ThreadPool (ThreadPool.GetAvailableThreads) zamiast "Hello World" i będzie bardzo ładnie widać, jak ich ubywa, kiedy taski się wykonują. TPL tworzy osobne wątki dla tasków tylko wtedy, kiedy wskażemy mu, że task będzie długo trwał (np. możemy stworzyć task z opcją TaskCreationOptions.LongRunning)<br />Moim zdaniem pomysł rozwiązania opisywanego problemu z wykorzystaniem do tego zarówno TPL, jaki ThreadPool i jeszcze Timera jest bardzo nietrafiony - lepiej wykorzystać Quartz.NET (jak to już napisał Procent). Tych trzech rozwiązań też lepiej nawet nie brać pod uwagę - nie tam tkwi błąd.Tomasz Wójcikhttp://blackfoot.plnoreply@blogger.comtag:blogger.com,1999:blog-364616448054212690.post-35820599632246449312011-02-27T12:05:53.813+01:002011-02-27T12:05:53.813+01:00Do takich rzeczy polecam bibliotekę Quartz.net.Do takich rzeczy polecam bibliotekę Quartz.net.Maciej Aniserowiczhttp://www.maciejaniserowicz.com/noreply@blogger.com