2010-12-13 19 views
5

WS 2008 R2'de IIS'de (tümleşik modda) çalışan WCF Services aracılığıyla başlatılan uzun süren iş süreçlerine sahibiz. Bu iş süreçleri, genellikle SQL Server arka planımızla çok sayıda etkileşim içerir. İsteklerin bir ilk servis çağrısı ile sıraya konması ve daha sonra öncelik temelinde yürütülmesi için özel bir görev sırası uygulaması oluşturduk. Bu yürütmenin tamamlanması uzun sürebilir (20-30 dakika aşırı). İstemciler daha sonra kendi arka plan görevlerinin ilerlemesi için sunucuyu sorgulayabilir.ThreadPools vs Uzun süren işlemler için Own Threads

Geçerli uygulamada, görevler ThreadPool'dan değil yürütmek için ayrı bir iş parçacığı üzerinde etkinleşir. Bu, ASP.NET isteklerinin sunulmasının açılmasını engellemek için ThreadPool kullanılarak uzun süredir çalışan görevlerin çalıştırılmaması nedeniyle reading recommendations nedeniyle yapıldı. Eşzamanlı olarak çalıştırılabilen arka plan görevlerinin sayısına bir üst sınır yerleştirerek ortaya çıkan iş parçacığı sayısını kontrol ediyoruz. Bu şekilde, CPU üzerindeki yükü kontrol etmeye ve çok fazla konu bağlamında anahtarlamayı önlemeye çalışırız. Bütün bunlar olsa da, elbette, başvuru için normal "online" taleplere de hizmet etmemiz gerekiyor.

Thomas Marquardt tarafından this post okunduktan sonra ThreadPool'u kullanmadığımız gerçeğinden endişe duyuyorum. Thomas'ın kapatma sorununu, ApplicationEnd olayına girerek ve uzun süren görevleri iptal ederek belirttik. Yani sorum şu, ThreadPool'u kullanmaya geçelim mi? Bu ipler uzun süreler boyunca bağlı olmaktan ne haber? Thomas'ı doğru bir şekilde anlarsam, ThreadPool'un normal çevrimiçi operasyonlara hizmet etmek için daha fazla istek oluşturmak için kendisini ayarlayacağından bunun önemli olmadığını söylüyor. Aynı zemini de kapsayan this StackOverflow question'u da okudum ama hala ilerlemenin yolunda emin değilim.

+0

Lütfen dikkat edin: eksik olanı düşündüğünüz belirli bir ayarlama hangisidir? –

+0

Belki de "ayarlama" kullanmak için doğru kelime değildi, ama ben arka plan görevleri ThreadPool konuları kullanılarak yürütüyor olsaydı, ThreadPool "koymak" ek "yük" sisteme koymak olduğu gerçeğine atıfta bulundu arka plan görevleri ile. Eğer normal konuları kullanarak çalıştırırsak ThreadPool bu bilgiye sahip değildir. Yine, ThreadPool sezgiselinin tam olarak nasıl çalıştığına dair iç detaylara sahip değilim, ancak Thomas'ın gönderdiği yazıyı okuduğumda, bu konudaki endişeyi dile getirdim. -ThreadPool konuları – Carel

cevap

1

Bu tam olarak sizin sorduğunuz şeyden değildir - ancak neden uzun süren görevlerinizi ayrı bir işlemde (örneğin windows hizmeti) birlikte yürütmeyesiniz - zaten bir öncelik sırası oluşturuyorsunuzdur ve istemciler sonuçlara geri sorgulayacaktır. zaman sonra. Ön tarafa bakan WCF Hizmetlerinin istekleri sıraya koyarken ve durum güncelleme sorgularına yanıt verirken, arka plan hizmetinin istekleri sunmaya devam edeceği bu yaklaşımla giderdim. Bu, çalışan işlemin geri dönmesine, hatta şu anda yürütülen görevleri sonlandırmak için endişelenmesine izin verir. Gördüğüm tek sorun, süreç dışı iletişimin genel gideridir, ancak o zaman görev tarafından alınan süreye kıyasla (uzun sürdüğü gibi) önemsiz olmamalıdır.

1

Benim önerim, sağladığınız bağlantılarda önerilen iş parçacığı açlık sorunlarına tam olarak sahip olduğum için ThreadPool'dan kaçınmaktır.

Ürünümüz, kullanıcının bir dizi teklifi gerçekleştiren bir web servisine çağrı yapmasına izin verir. Bu, 40 dakikaya kadar süren uzun bir işlem olabilir, tırnak işlemi CPU yoğundur, bu yüzden en yüksek CPU kullanımını elde etmek için dört çekirdekli sunucumuzdaki iplik havuzunu kullanırız.

Ancak ASP.NET, istekleri sunmak için iş parçacığı havuzunu kullanıyormuş gibi göründüğünden, kullanıcılar tarafından sunulan tüm yeni işlerin, ilk işin tamamlanmasına kadar hiçbir zaman işe yaramadı. havuzu. Bunu aşmak için bir süre önce ThreadPoolThrottle adlı web'de bulduğum bir sınıf kullanıyordum. Bu, sorunları birazcık artırdı, ancak sistemin kullanımı arttıkça, aynı sorunlara da dönüşüyoruz.

Şimdi, asp.net uygulamasında iş parçacığı açlığını önlemek için VinayC'ın işlemden alıntı yapma önerisini düşünüyorum.

İlgili konular