Czy jest skuteczny doSpinWait vs Sleep waiting. Który użyć?
SpinWait.SpinUntil(() => myPredicate(), 10000)
na timeout 10000ms
lub
Czy to jest bardziej wydajny w użyciu Thread.Sleep
odpytywanie na tych samych warunkach Na przykład coś wzdłuż linii następujących SleepWait
funkcja:
public bool SleepWait(int timeOut)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (!myPredicate() && stopwatch.ElapsedMilliseconds < timeOut)
{
Thread.Sleep(50)
}
return myPredicate()
}
Jestem przeciw czy wszystkie plony z SpinWait mogą nie być dobrym wzorcem użytkowania, jeśli mówimy o przekroczeniach czasu w ciągu 1 sekundy? Czy to jest prawidłowe założenie?
Które podejście preferujesz i dlaczego? Czy istnieje jeszcze lepsze podejście?
Aktualizacja - Staje się coraz bardziej konkretne:
Czy istnieje sposób, aby BlockingCollection Pulse wątek śpiącego, gdy osiągnie ograniczone zdolności? Raczej unikałem pracowitych czekań, tak jak sugeruje Marc Gravel.
Dzięki, podoba mi się twoja odpowiedź, to byłoby naprawdę miłe. Załóżmy, że śledzisz wykorzystanie niektórych zasobów za pomocą BlockingCollection. Przyzwyczajają się (i usuwają z kolekcji) i wracają do kolekcji, gdy są ponownie dostępne do ponownego użycia. Zamknięcie może nastąpić tylko wtedy, gdy wszystkie te elementy powrócą do kolekcji. Jak byś poszła o sygnalizowaniu, że zamknięcie może iść naprzód (tzn. Zbieranie znów jest pełne) innym niż pracowite czekanie? – Anastasiosyal
@Anastasiosyal Chciałbym enkapsulować kolekcję i mieć opakowanie zrobić coś, gdy jest pełna; właściwie, prawdopodobnie użyłbym do tego celu 'Monitor'a (doda przykład). –
W destruktorze klasy" ObjectPool ", która pochodzi z BlockingQueue, wyskakuj wszystkie obiekty z BlockingCollection i usuwaj je, (ponieważ jest to C#, ustaw pobraną referencję na zero), dopóki liczba wykasowanych obiektów nie będzie równa głębokości basenu. Wszystkie połączone obiekty zostały następnie usunięte, więc możesz usunąć kolejkę i powrócić z dtor, aby kontynuować sekwencję zamykania. Nie jest wymagany głosowanie/busywait! Być może zechcesz poświęcić trochę czasu na pobranie, aby przeciekany obiekt w końcu spowodował wyjątek (lub coś takiego). –