Mamy kilka długich procesów biznesowych, które są inicjowane za pośrednictwem usług WCF działających w IIS (tryb zintegrowany) na WS 2008 R2. Te procesy biznesowe zazwyczaj wymagają dużej interakcji z naszym zapleczem SQL Server. Stworzyliśmy niestandardową implementację kolejki zadań, w której żądania są kolejkowane za pośrednictwem początkowego wywołania usługi, a następnie wykonywane w oparciu o priorytet. Wykonanie tego może zająć dużo czasu (ekstremalne 20-30 minut). Klienci mogą następnie wysyłać zapytania do serwera o postęp własnych zadań w tle.ThreadPools vs Własne wątki dla długotrwałych procesów
W naszej obecnej realizacji zadania odpalają się na osobnym wątku, aby wykonać, a nie z ThreadPool. Zrobiono to, ponieważ reading recommendations nie uruchamiał długotrwałych zadań wykorzystujących ThreadPool, aby uniemożliwić odgórne wyświetlanie żądań ASP.NET. Kontrolujemy liczbę wątków tworzonych przez umieszczenie górnego limitu liczby zadań tła, które mogą być wykonywane jednocześnie. W ten sposób staramy się kontrolować obciążenie procesora i zapobiegać zbyt dużemu przełączaniu kontekstu wątków. Podczas gdy to wszystko się dzieje, oczywiście nadal musimy obsługiwać zwykłe "on-line" żądania aplikacji.
Po przeczytaniu this post przez Thomasa Marquardta martwię się o to, że nie używamy ThreadPool, ponieważ nie będziemy korzystać z heurystyki tuningowej. Rozwiązujemy już problem zamykania, o którym Thomas wspomniał, zahaczając o zdarzenie ApplicationEnd i anulując długo działające zadania. Moje pytanie brzmi: czy powinniśmy przejść do używania ThreadPool? A co z tymi wątkami związanymi na długie okresy czasu? Jeśli dobrze rozumiem Thomasa, mówi on, że to nie ma znaczenia, ponieważ ThreadPool dostroi się, by stworzyć więcej żądań służących normalnym operacjom on-line? Przeczytałem również this StackOverflow question, który obejmuje te same podstawy, ale nadal nie jestem pewien co do dalszego rozwoju.
Proszę wyjaśnić: jakiego konkretnego tuningu uważasz, może być brakujące? –
Być może "melodia" nie była właściwym słowem, ale miałem na myśli to, że jeśli zadania w tle były wykonywane przy użyciu wątków ThreadPool, ThreadPool "byłby awarią" dodatkowego "obciążenia" umieszczanego w systemie przez zadania w tle. Jeśli uruchomimy je za pomocą normalnych wątków, ThreadPool nie ma tej wiedzy. Ponownie, nie mam wewnętrznych szczegółów, jak heurystyka ThreadPool działa dokładnie, ale przeczytanie postu Thomasa wzbudziło obawy z mojej strony, że jesteśmy side-stepping tą "tuningową" logiką wbudowaną w ThreadPool przez uruchomienie jej własnego -ThreadPool wątki – Carel