Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
System.Threading.Semaphore sınıfı adlandırılmış (systemwide) veya yerel semaforu temsil eder. Win32 semafor nesnesinin etrafında ince bir sarıcıdır. Win32 semaforları, kaynak havuzuna erişimi denetleyen semaforları saymaktadır.
SemaphoreSlim sınıfı, bekleme sürelerinin kısa olması beklenen tek bir işlem içinde beklemek için kullanılabilecek hafif, hızlı bir semaforu temsil eder. Döndürme bekleme aşamasında CPU etkin bir şekilde çalışır, boşta değildir. "Kısa" sözcüğün ne kadar kısa olması, beklemenin doğasına bağlıdır: İş parçacıkları CPU kaynakları için yarışıyorsa, dönen iş parçacığı CPU süresi tüketir, bu nedenle bekleme çok kısa olmalı ve mikrosaniye cinsinden ölçülmelidir. Bekleme, CPU'ya bağlı olmayan bir kaynak (G/Ç gibi) içinse, döndürme bekleme ek yükü daha az endişe vericidir ve kabul edilebilir bekleme biraz daha uzun olabilir ve milisaniye cinsinden ölçülür. Bekleme süreleri öngörülemez olduğunda veya uzun olması beklendiğinde, bunun yerine System.Threading.Semaphore kullanın, bu içerik döndürmez. SemaphoreSlim , ortak dil çalışma zamanı (CLR) tarafından sağlanan eşitleme temel öğelerine mümkün olduğunca çok bağlıdır. Ancak, birden çok semaforda beklemeyi desteklemek için gerekli olan, gevşek olarak başlatılan, çekirdek tabanlı bekleme tanıtıcıları da sağlar. SemaphoreSlim ayrıca iptal belirteçlerinin kullanımını da destekler, ancak adlandırılmış semaforları veya eşitleme için bekleme tutamacının kullanımını desteklemez.
Sınırlı bir kaynağı yönetme
İş parçacıkları semafor türüne bağlı olarak farklı metotlar çağırarak semafora girerler. Bir System.Threading.Semaphore nesne için WaitOne yöntemini, (öğesinden devralınan WaitHandle) çağırın. Bir SemaphoreSlim nesnesi için SemaphoreSlim.Wait veya SemaphoreSlim.WaitAsync yöntemini çağırın. Çağrı geri döndüğünde, semafordaki sayı azalır. Bir iş parçacığı giriş istediğinde ve sayı sıfır olduğunda, iş parçacığı engellenir. İş parçacıkları Semaphore.Release veya SemaphoreSlim.Release yöntemini çağırarak semaforu serbest bıraktığında, engellenen iş parçacıkları girebilir. Sıranın garanti edildiği bir düzen—ilk giren, ilk çıkan (FIFO) veya son giren, ilk çıkan (LIFO) gibi—engellenmiş iş parçacığının bir sonraki semafora girmesini belirlemez.
İş parçacığı, semafora birden fazla kez girmek için System.Threading.Semaphore nesnesinin yöntemini veya WaitOne nesnesinin SemaphoreSlimWait yöntemini tekrar tekrar çağırabilir. Semaforu serbest bırakmak için, iş parçacığının girdiği aynı sayıda Semaphore.Release() veya SemaphoreSlim.Release() yöntemini çağırın. Alternatif olarak, Semaphore.Release(Int32) veya SemaphoreSlim.Release(Int32) aşırı yüklemesini çağırın ve serbest bırakılacak giriş sayısını belirtin.
Semaforlar ve iş parçacığı kimliği
İki semafor türü, iş parçacığı kimliğini WaitOne, Wait, Release ve SemaphoreSlim.Release yöntemlerine yapılan çağrılarda zorlamaz. Örneğin, semaforlar için yaygın bir kullanım senaryosu, bir üretici iş parçacığı ile bir tüketici iş parçacığını içerir, bu iş parçacıklarından biri her zaman semafor sayısını artırırken diğeri her zaman azaltır.
Bir iş parçacığının semaforu çok fazla serbest bırakmadığından emin olun. Örneğin, bir semaforun en fazla iki sayısı olduğunu ve A ve B iş parçacığının semafora girdiğini varsayalım. B iş parçacığındaki bir programlama hatası iki kez çağırmasına Release neden olursa, her iki çağrı da başarılı olur. Semafordaki sayı dolu ve A iş parçacığı sonunda Release'ı çağırdığında bir SemaphoreFullException fırlatılır.
Adlandırılmış semaforlar
Windows işletim sistemi semaforların adlara sahip olmasını sağlar. Adlandırılmış bir semafor tüm sistemde geçerlidir; oluşturulduktan sonra, tüm işlemlerdeki tüm iş parçacığı (thread) tarafından görünür. Bu nedenle adlandırılmış semaforlar, işlemlerin ve iş parçacıklarının etkinliklerini senkronize edebilir.
Semaphore Bir adı belirten oluşturuculardan birini kullanarak adlandırılmış sistem semaforunu temsil eden bir nesne oluşturun.
Önemli
Adlandırılmış semaforlar sistem genelinde olduğundan, aynı adlandırılmış semaforu temsil eden birden çok Semaphore nesneye sahip olmak mümkündür. Bir oluşturucuyu veya Semaphore.OpenExisting yöntemini her çağırdığınızda yeni Semaphore bir nesne oluşturulur. Aynı adın belirtilmesi, aynı adlandırılmış semaforu temsil eden birden çok nesne oluşturur.
Adlandırılmış semaforları kullanırken dikkatli olun. Sistem genelinde olduklarından, aynı adı kullanan başka bir işlem beklenmedik bir şekilde semaforunuzu girebilir. Aynı bilgisayarda yürütülen kötü amaçlı kod, bunu hizmet reddi saldırısının temeli olarak kullanabilir.
Adlandırılmış bir semaforu temsil eden Semaphore nesnesini korumak için, bir System.Security.AccessControl.SemaphoreSecurity nesneyi belirten bir oluşturucu kullanarak erişim kontrol güvenliğini kullanın. Yöntemini kullanarak Semaphore.SetAccessControl erişim denetimi güvenliği de uygulayabilirsiniz, ancak bu, semaforun oluşturulduğu ve korunduğu zaman arasında bir güvenlik açığı penceresi bırakır. Erişim denetimi güvenliği ile semaforların korunması kötü amaçlı saldırıların önlenmesine yardımcı olur, ancak istenmeyen ad çakışmaları sorununu çözmez.