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.
sınıfı, EventWaitHandle iş parçacıklarının sinyal göndererek ve sinyalleri bekleyerek birbirleriyle iletişim kurmasını sağlar. Olay bekleme tanıtıcıları (yalnızca olaylar olarak da adlandırılır), bir veya daha fazla bekleyen iş parçacığını serbest bırakmak için sinyal verilebilen bekleme tanıtıcılarıdır. İşaretlendikten sonra, olay bekleme işleyicisi el ile veya otomatik olarak sıfırlanır. EventWaitHandle sınıfı yerel olay bekleme tutamacını (yerel olay) veya adlandırılmış bir sistem olayı bekleme tutamacını (adlandırılmış olay veya sistem olayı, tüm işlemler tarafından görülebilir) temsil edebilir.
Uyarı
Olay bekleme tutamaçları .NET etkinlikleri değildir. Hiçbir temsilci veya olay işleyicisi söz konusu değildir. "event" sözcüğü, geleneksel olarak işletim sistemi olayları olarak adlandırıldıklarından ve bekleme tutamacını işaret etme eylemi bir olayın gerçekleştiğini bekleyen iş parçacıklarına işaret ettiğinden bunları tanımlamak için kullanılır.
Hem yerel hem de adlandırılmış olay bekleme tutamaçları, kaynakların serbest bırakıldığından emin olmak için sarmalayıcılarla korunan sistem eşitleme nesnelerini kullanır. nesnesini kullanmayı bitirdiğinizde kaynakları hemen boşaltmak için yöntemini kullanabilirsiniz Dispose .
Otomatik Olarak Sıfırlayan Olay Bekleme İşleyicileri
Nesneyi EventResetMode.AutoReset oluşturduğunuzda EventWaitHandle belirterek bir otomatik sıfırlama olayı oluşturursunuz. Adından da anlaşılacağı gibi, bu eşitleme olayı bir sinyal verildiğinde ve ardından tek bir bekleyen iş parçacığı serbest bırakıldığında otomatik olarak sıfırlanır. Olayı Set yöntemini çağırarak sinyal verin.
Otomatik sıfırlama olayları genellikle tek seferde tek bir iş parçacığı için kaynağa özel erişim sağlamak için kullanılır. Bir iş parçacığı WaitOne yöntemini çağırarak kaynağı ister. Başka bir iş parçacığı bekleme tutamacını tutmuyorsa, yöntem true döndürür ve çağıran iş parçacığı kaynağın denetimine sahiptir.
Önemli
Tüm eşitleme mekanizmalarında olduğu gibi, korumalı bir kaynağa erişmeden önce tüm kod yollarının uygun bekleme tutamacını beklemesini sağlamanız gerekir. İş parçacığı eşitlemesi işbirliğine dayalıdır.
Hiçbir iş parçacığı beklemediğinde otomatik sıfırlama olayına işaret edilirse, bir iş parçacığı beklemeye çalışılana kadar sinyalli kalır. Olay, iş parçacığını serbest bırakır, hemen yeniden ayarlanır ve sonraki iş parçacıklarını engeller.
El ile Sıfırlayan Olay Bekleme İşleyicileri
EventResetMode.ManualReset belirterek EventWaitHandle nesnesini oluşturduğunuzda el ile sıfırlama olayı oluşturursunuz. Adından da anlaşılacağı gibi, bu eşitleme olayı sinyal verildikten sonra el ile sıfırlanmalıdır. Etkinlik resetlenene kadar, metodu Reset çağırarak olay işleyicisinde bekleyen iş parçacıkları engellenmeden hemen devam eder.
El ile sıfırlama olayı, bir ağılın kapısı gibi işlev görür. Olay sinyal verilmediğinde, bekleyen iş parçacıkları, bir ağıldaki atlar gibi bloklanır. Olay sinyallendiğinde, Set yöntemini çağırarak tüm bekleyen iş parçacıkları serbestçe devam edebilir. Yöntemi olan Reset çağrılana kadar olay sinyalli kalır. Bu, manuel sıfırlama olayını, bir thread'in bir görevi tamamlamasını beklemesi gereken diğer thread'leri durdurmak için ideal bir yol haline getirir.
Bir ağıldan ayrılan atlar gibi, serbest bırakılan iş parçacıklarının işletim sistemi tarafından zamanlanması ve yürütmeye devam etmesi de zaman alır. Reset Yöntemi, tüm iş parçacıkları yürütmeyi sürdürmeden önce çağrılırsa, kalan iş parçacıkları bir kez daha engeller. Hangi iş parçacıklarının devam ettiğini ve hangi iş parçacıklarının engellendiğini, sistemdeki yük, programlayıcıyı bekleyen iş parçacıklarının sayısı gibi rastgele faktörler vb. belirler. Olayı işaret eden iş parçacığının en yaygın kullanım deseni olan sinyal sonrasında sona ermesi durumunda bu sorun olmaz. Olayı işaret eden iş parçacığının, tüm bekleyen iş parçacıkları devam etmeden yeni bir görev başlatmasını istiyorsanız, öncelikle bunu engellemeniz gerekir. Aksi takdirde, bir yarış durumunuz vardır ve kodunuzun davranışı tahmin edilemez.
Otomatik ve El ile Gerçekleştirilen Olaylara Ortak Özellikler
Genellikle, engeli kaldırılmış bir iş parçacığı yöntemini çağırana EventWaitHandle kadar bir Set veya daha fazla iş parçacığı bloğu oluşturur ve bu yöntem bekleyen iş parçacıklarından birini (otomatik sıfırlama olayları söz konusu olduğunda) veya tümünü (el ile sıfırlama olayları söz konusu olduğunda) serbest bırakır. Bir iş parçacığı, önce bir EventWaitHandle sinyali verebilir ve ardından bunu, statik WaitHandle.SignalAndWait yöntemi çağırarak atomik işlem olarak engelleyebilir.
EventWaitHandle nesneleri statik WaitHandle.WaitAll ve WaitHandle.WaitAny yöntemlerle kullanılabilir. EventWaitHandle ve Mutex sınıfları her ikisi de WaitHandle'den türetildiği için, bu yöntemlerle her iki sınıfı da kullanabilirsiniz.
Adlandırılmış Olaylar
Windows işletim sistemi, olay bekleme tanıtıcılarına isim verilmesine olanak tanır. Adlandırılmış olay sistem çapındadır. Diğer bir ifadeyle, adlandırılmış olay oluşturulduktan sonra tüm işlemlerdeki tüm iş parçacıkları tarafından görülebilir. Bu nedenle, adlandırılmış olaylar hem işlemlerin hem de iş parçacıklarının etkinliklerini senkronize etmek için kullanılabilir.
Bir olay adı belirten oluşturuculardan birini kullanarak adlandırılmış bir sistem olayını temsil eden bir nesne oluşturabilirsiniz EventWaitHandle .
Uyarı
Adlandırılmış olaylar sistem genelinde olduğundan, aynı adlandırılmış olayı temsil eden birden çok EventWaitHandle nesne olması mümkündür. Bir oluşturucuyu veya OpenExisting yöntemini her çağırdığınızda yeni EventWaitHandle bir nesne oluşturulur. Aynı adın belirtilmesi, aynı adlandırılmış olayı temsil eden birden çok nesne oluşturur.
Adlandırılmış olayları kullanırken dikkatli olunması tavsiye edilir. Sistem genelinde olduklarından, aynı adı kullanan başka bir işlem threadlerinizi ansızın engelleyebilir. 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 olayı temsil eden bir EventWaitHandle nesneyi korumak için erişim denetimi güvenliğini kullanın, tercihen bir nesneyi belirten EventWaitHandleSecurity bir oluşturucu kullanın. Yöntemini kullanarak SetAccessControl erişim denetimi güvenliği de uygulayabilirsiniz, ancak bu, olay bekleme tutamacının oluşturulduğu ve korunduğu süre arasında bir güvenlik açığı penceresi bırakır. Olayları erişim denetimi güvenliğiyle korumak kötü amaçlı saldırıları önlemeye yardımcı olur, ancak istenmeyen ad çakışmaları sorununu çözmez.
Uyarı
Farklı olarak EventWaitHandle sınıfından türetilen sınıflar AutoResetEvent ve ManualResetEvent yalnızca yerel bekleme tanıtıcılarını temsil edebilir. Adlandırılmış sistem olaylarını temsil edemezler.