EventWaitHandle
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 bir olay bekleme tutamacı 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.
Not
Olay bekleme tutamaçları .NET olayları 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ılar tarafından SafeWaitHandle 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 ne zaman oluşturduğunuzu belirterek EventResetMode.AutoReset bir otomatik sıfırlama olayı oluşturursunuz EventWaitHandle . Adından da anlaşılacağı gibi, bu eşitleme olayı tek bir bekleyen iş parçacığı serbest bırakıldıktan sonra sinyal gönderildiğinde otomatik olarak sıfırlanır. yöntemini çağırarak olaya sinyal verin Set .
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ığı yöntemini çağırarak kaynağı istemektedir WaitOne . Bekleme tutamacını tutan başka bir iş parçacığı yoksa, yöntemi döndürür true
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 ve hemen sıfırlanır ve sonraki iş parçacıklarını engeller.
El ile Sıfırlayan Olay Bekleme İşleyicileri
Nesneyi ne zaman oluşturduğunuzu belirterek EventResetMode.ManualReset el ile sıfırlama olayı oluşturursunuz EventWaitHandle . Adından da anlaşılacağı gibi, bu eşitleme olayı sinyal verildikten sonra el ile sıfırlanmalıdır. Sıfırlanıncaya kadar yöntemini çağırarak Reset , olay tanıtıcısında bekleyen iş parçacıkları engelleme olmadan hemen devam eder.
El ile sıfırlama olayı, bir ağılın kapısı gibi davranır. Olay sinyal verilmediğinde, üzerinde bekleyen iş parçacıkları, bir ağıldaki atlar gibi engeller. Olay sinyallendiğinde, yöntemini çağırarak Set tüm bekleyen iş parçacıkları devam edebilir. Yöntemi çağrılana Reset kadar olay sinyalli kalır. Bu, el ile sıfırlama olayını, bir iş parçacığı görevi tamamlayana kadar beklemesi gereken iş parçacıklarını tutmak için ideal bir yol haline getirir.
Bir ağıldan ayrılan atlar gibi, yayımlanan iş parçacıklarının işletim sistemi tarafından zamanlanması ve yürütmeyi sürdürmesi 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 sürdürülmesi ve hangi iş parçacıkları bloğu sistemdeki yük, zamanlayıcıyı bekleyen iş parçacığı sayısı gibi rastgele faktörlere bağlıdır. 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ı sürdürüldükten sonra yeni bir görev başlatmasını istiyorsanız, tüm bekleyen iş parçacıkları devam edene kadar 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 Set kadar bir EventWaitHandle 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. İş parçacığı, statik WaitHandle.SignalAndWait yöntemi çağırarak atomik işlem olarak bir EventWaitHandle sinyal verebilir ve bunu engelleyebilir.
EventWaitHandle nesneleri statik WaitHandle.WaitAll ve WaitHandle.WaitAny yöntemlerle kullanılabilir. ve Mutex sınıflarının EventWaitHandle her ikisi de 'den WaitHandletüretildiği için, her iki sınıfı da bu yöntemlerle kullanabilirsiniz.
Adlandırılmış Olaylar
Windows işletim sistemi, olay bekleme tanıtıcılarının adlara sahip olmasını sağlar. Adlandırılmış olay sistem genelindedir. 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 eşitlemek 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 .
Not
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 iş parçacıklarınızı beklenmedik bir şekilde 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.
Not
sınıfından EventWaitHandle farklı olarak 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.