2011-02-17 30 views
5

Çok sayıda Görev örneği oluşturdum. Hepsini çalıştırmam ve hepsinin tamamlanmasını beklemem gerek. Sorun şu ki, herhangi bir zamanda “başlatılmış” ve “tamamlandı” arasında en fazla X görevinin olmadığından emin olmam gerekiyor; Görevler, eşzamanlı çağrıların sayısı üzerinde kısıtlama olan diğer taraflara yapılan çağrıları içerir. Bu kısıtlamalar benim donanımıma dayanmadığından, yerleşik bir akıllı daralmaya dayanamıyorum; Limiti kesinlikle uygulamak zorundayım. Görevlerin paylaşılan bir değişkeni iş parçacığı güvenli bir şekilde artırıp azaltarak yapabildim, ancak gereksiz bir şekilde gereksiz görünüyor. Doğrudan API’ya daha yerleşik olan bir yol mu yoksa eksik bir kolay senkronizasyon aracı mı?Birçok .NET Görev örneğini atmanın en iyi yolu nedir?

+1

Bir Semaphore bana iyi bir çözüm gibi geliyor. –

cevap

4

Sen How to: Create a Task Scheduler That Limits the Degree of Concurrency

Düzenleme bakın kendi görev zamanlayıcı oluşturmak zorunda: Bu Semaphore ile daha fazla kod gerektirir ancak iş parçacığı havuzu hangi görevler yürütülür, çünkü bu daha iyi performans gibi bir his var senin semaforun farkında değil, ama TaskScheduler kullanarak kendi kurallarına göre oynuyor.

Düzenleme 2: semafor kullanmanın mümkün dezavantajı biri, iş parçacığı havuzu görev IO işlemlerini yaptığını düşünmek ve (bir defada onları çok planlama yapabileceği onlar orada asmak ve onlar 'don nedeniyle, bekleyin böylece CPU'ya ihtiyaç var). TaskScheduler kullanarak onlar için yer olduğunda tam olarak programlanacaktır. Havuz temizleyiciyi kesinlikle tutacaktır.

1

Semaphore sınıfı sizin için işe yarayabilecek: http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

nasıl kullanılacağını göstermek için bu MSDN sayfasındaki iyi bir örnek vardır.

Ayrıca, aynı ucu gerçekleştirmek için kullanabileceğiniz daha hafif yerleşik iç içe geçirme havuzu/senkronizasyon mekanizmaları da olabilir, ancak Semafor temel olarak sizin istediğiniz şeyi yapmak için tasarlanmıştır.

+1

.net 4.0 ve Semaphore hakkında konuşursam SemaphoreSlim'e bakmanızı öneririm: http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx – Andrey

İlgili konular