jaka jest różnica between System.Windows.Forms.Timer()
i System.Windows.Threading.DispatcherTimer()
? W jakich przypadkach powinniśmy ich używać? jakieś najlepsze praktyki?
jaka jest różnica between System.Windows.Forms.Timer()
i System.Windows.Threading.DispatcherTimer()
? W jakich przypadkach powinniśmy ich używać? jakieś najlepsze praktyki?
Odpowiedzi:
Windows.Forms.Timer
używa pętli komunikatów formularzy Windows do przetwarzania zdarzeń czasowych. Powinien być używany podczas pisania zdarzeń czasu, które są używane w aplikacjach Windows Forms i chcesz, aby licznik czasu był uruchamiany w głównym wątku interfejsu użytkownika.
DispatcherTimer
jest mechanizmem czasowym WPF. Powinien być używany, gdy chcesz obsługiwać synchronizację w podobny sposób (chociaż nie jest to ograniczone do pojedynczego wątku - każdy wątek ma swój własny dyspozytor) i używasz WPF. Wywołuje zdarzenie w tym samym wątku co Dispatcher.
Ogólnie WPF == DispatcherTimer
i Windows Forms == Forms.Timer
.
Biorąc to pod uwagę, istnieje również System.Threading.Timer
, który jest zegarem, class
który uruchamia się w osobnym wątku. Jest to dobre dla czysto numerycznego pomiaru czasu, w którym nie próbujesz aktualizować interfejsu użytkownika itp.
Znalazłem dobry artykuł na temat timerów z małymi przykładami tutaj: http://www.progware.org/Blog/post/Timers-in-WPF.aspx
Jako podsumowanie:
Jeśli DoSomething () manipuluje komponentami GUI, to za pomocą Timera musisz użyć: this.Dispatcher.Invoke ((Action) delegate {// GUI RELATED CODE HERE}, ponieważ nie możesz uzyskać dostępu do kontrolek GUI bezpośrednio z innego wątku. nie trzeba tego robić.
Jeśli DoSomething () wykona czasochłonne zadanie, to GUI zawiesi się w przypadku DispatcherTimer. W przypadku Timera tak się nie stanie, ponieważ długie metody są wykonywane w innym wątku