2009-10-08 11 views
7

Wprowadzam limit czasu na asynchroniczną operację (serię sieciowych operacji wejścia) i nie jestem pewien, która jest "lepsza" (z perspektywy alokacji/wydajności): tworzenie EventWaitHandle i przy użyciu RegisterWaitForSingleObject, lub po prostu tworzenie Timer i przy użyciu jego Tick..Net Limity czasu: WaitForSingleObject vs Timer

W moim konkretnym przypadku EventWaitHandle jest leniwy, ale oczywiście musi być utworzony w instancji, aby używać WaitForSingleObject. Tak naprawdę to jest pytanie o koszt zasobów WaitHandle + WaitForSingleObject vs Timer. Oba podejścia są równie łatwe do wdrożenia.

Zaimplementowałem oba w różnym czasie, więc rozumiem teren, po prostu nie jestem pewien, które podejście jest "lepsze".

Odpowiedz

3

Microsoft's Morgan Skinner seems to prefer RegisterWaitForSingleObject.

Jeśli chodzi o alokacje są zainteresowane, reflektor ujawnia, że ​​RegisterWaitForSingleObject utworzyć instancję RegisteredWaitHandle, podczas gdy zegar tworzy wewnętrzną TimerBase, jak również klasę o nazwie _TimerCallback. Można przejść dalej i porównać rozmiary tych klas i tak dalej, ale wydaje się, że mają więcej zależności, zwłaszcza niezarządzanych (oba wykorzystują podstawowe funkcje win32) - tak naprawdę nie mogę dać prostej odpowiedzi.

Jeśli chodzi o uchwyt oczekiwania przekazany do RegisterWaitForSingleObject, pamiętaj, że możesz przydzielić pojedynczy Maunal/AutoResetEvent i przekazać go do wszystkich połączeń (ponieważ liczysz na limit czasu, więc i tak go nie sygnalizujesz) .

Jeśli chodzi o wydajność, nie jestem pewien. ThreadPool użyje specjalnego wątku oczekującego na każde 63 akcje zarejestrowane za pomocą RegisterWaitForSingleObject. W przeciwieństwie do tego, zegar będzie korzystał z bazowego timera win32. Oba zostaną zakończone przy użyciu wątku roboczego ThreadPool dla rzeczywistego wykonania. Które jest lepsze w jakich scenariuszach? Bije mnie .. tak pójdę z Skinner na ten jeden :)

zobacz także:

+0

Jego artykuł na blogu jest dobre porównanie zastosowań, ale nie jest bardzo silnym zaleceniem faworyzowania jednego z drugim. I im więcej o tym myślałem, tym bardziej nie widziałem żadnej różnicy w zakresie przejść jądra i tak dalej. Nadal chciałbym wiedzieć, czy nie było żadnych różnic w kosztach dla bazowego interfejsu Win32 API, ale "waga" implementacji .net wydaje się najlepszą odpowiedzią, którą również znalazłem. – piers7

1

Nic nie jest lepsze. Timer służy do okresowego "szturchania" twojej nici, aby coś zrobić. WaitForSingleObject czeka na uchwytach. Limit czasu jest dostępny, więc możesz go użyć, aby przestać czekać, zamiast tkwić w martwym punkcie. Użycie timera do przerwania oczekiwania na wyjście z blokady nie jest wymagane, jeśli używasz limitu czasu.

Koszt zasobów jest nieistotny dla obu. Nie mogę powiedzieć, z którego podejścia powinieneś skorzystać, ponieważ jest to bardzo zależne od sytuacji kodowej, którą masz.

+2

nie zgadzam. Jest to proste pytanie: koszt alokowania licznika czasu w porównaniu z kosztem przydzielania wartości Waithandle i WaitForSingleObject. Oba są zasobami systemu operacyjnego. Jeden musi kosztować więcej niż drugi, niezależnie od mojej sytuacji. I chociaż w tym scenariuszu mówię o czasomierzu jednorazowym, * oba * mogą być używane do okresowego "szturchania" twojego kodu - możesz użyć flagi "executeOnlyOnce" na RegisterWaitForSingleObject ... – piers7

Powiązane problemy