System.Threading.Monitor.Wait yöntemleri

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

Wait(Object, Int32, Boolean) Yöntem

Bu yöntem, parametresinde obj özel bir kilit alana kadar döndürmez.

Şu anda belirtilen nesnedeki kilidin sahibi olan iş parçacığı, nesneyi başka bir iş parçacığının erişebilmesi için serbest bırakmak için bu yöntemi çağırır. Arayan, kilidi yeniden almak için beklerken engellenir. Çağıranın başka bir iş parçacığının işlemlerinin sonucu olarak gerçekleşecek durum değişikliğini beklemesi gerektiğinde bu yöntem çağrılır.

Zaman aşımı, başka bir iş parçacığının önce veya PulseAll yöntemini çağırmadan kilidi serbest bırakması durumunda geçerli iş parçacığının Pulse süresiz olarak engellememesini sağlar. Ayrıca iş parçacığını hazır kuyruğa taşır ve bekleme kuyruğunda önündeki diğer iş parçacıklarını atlayarak kilidi daha erken yeniden alabilir. İş parçacığı, zaman aşımından önce kilidi yeniden alıp almadığını belirlemek için yönteminin dönüş değerini Wait test edebilir. İş parçacığı beklemeye girmesine neden olan koşulları değerlendirebilir ve gerekirse yöntemini yeniden çağırabilir Wait .

bir iş parçacığı çağırdığında Waitkilidi serbest bırakır ve bekleme kuyruğuna girer. Bu noktada, hazır kuyruktaki bir sonraki iş parçacığının (varsa) kilidin denetimini almasına izin verilir. Çağrılan Wait iş parçacığı, kilidi tutan bir iş parçacığı çağırana PulseAllkadar bekleme kuyruğunda kalır veya kuyrukta bir sonraki iş parçacığıdır ve kilidi tutan bir iş parçacığı çağırır Pulse. Ancak, başka bir iş parçacığının bu nesnenin Pulse veya PulseAll yöntemini çağırmadan önce geçmesi durumundamillisecondsTimeout, özgün iş parçacığı kilidi yeniden kazanmak için hazır kuyruğa taşınır.

Not

parametresi için belirtilirseInfinite, kilit sahibi veya PulseAllçağrısı Pulse yapmadığı sürece bu yöntem süresiz olarak millisecondsTimeout engeller. 0'a eşitse millisecondsTimeout , çağıran Wait iş parçacığı kilidi serbest bırakır ve kilidi yeniden kazanmak için hemen hazır kuyruğa girer.

Çağıran, belirtilen nesne için kaç kez Enter çağrıldığından bağımsız olarak bir kez yürütülürWait. Kavramsal olarak, Wait yöntemi çağıranın nesnede kaç kez çağırıldığını Enter depolar Exit ve kilitli nesneyi tam olarak serbest bırakmak için gerektiği kadar çağrır. Çağıran daha sonra nesneyi yeniden almak için beklerken engeller. Çağıran kilidi yeniden aradığında sistem, arayan için kaydedilen Enter sayıyı geri yüklemek için gerektiği kadar çok kez çağırırEnter. Çağrısı Wait yalnızca belirtilen nesnenin kilidini serbest bırakır; çağıran diğer nesnelerdeki kilitlerin sahibiyse, bu kilitler serbest bırakılmaz.

Not

Eşitlenmiş bir nesne, kilit tutan iş parçacığına başvuru, kilidi almaya hazır iş parçacıklarını içeren hazır kuyruğa başvuru ve nesnenin durumundaki bir değişiklik bildirimini bekleyen iş parçacıklarını içeren bekleme kuyruğuna başvuru da dahil olmak üzere çeşitli başvuruları içerir.

Pulse, PulseAllve Wait yöntemleri eşitlenmiş bir kod bloğu içinden çağrılmalıdır.

yöntemine yönelik Pulse açıklamalar, bekleyen bir iş parçacığı olmadığında çağrılırsa Pulse ne olacağını açıklar.

Wait(Object, TimeSpan, Boolean) Yöntem

Bu yöntem, parametresinde obj özel bir kilit alana kadar döndürmez.

Şu anda belirtilen nesnedeki kilidin sahibi olan iş parçacığı, nesneyi başka bir iş parçacığının erişebilmesi için serbest bırakmak için bu yöntemi çağırır. Arayan, kilidi yeniden almak için beklerken engellenir. Çağıranın başka bir iş parçacığının işlemlerinin sonucu olarak gerçekleşecek durum değişikliğini beklemesi gerektiğinde bu yöntem çağrılır.

Zaman aşımı, başka bir iş parçacığının önce veya PulseAll yöntemini çağırmadan kilidi serbest bırakması durumunda geçerli iş parçacığının Pulse süresiz olarak engellememesini sağlar. Ayrıca iş parçacığını hazır kuyruğa taşır ve bekleme kuyruğunda önündeki diğer iş parçacıklarını atlayarak kilidi daha erken yeniden alabilir. İş parçacığı, zaman aşımından önce kilidi yeniden alıp almadığını belirlemek için yönteminin dönüş değerini Wait test edebilir. İş parçacığı beklemeye girmesine neden olan koşulları değerlendirebilir ve gerekirse yöntemini yeniden çağırabilir Wait .

bir iş parçacığı çağırdığında Waitkilidi serbest bırakır ve bekleme kuyruğuna girer. Bu noktada, hazır kuyruktaki bir sonraki iş parçacığının (varsa) kilidin denetimini almasına izin verilir. Çağrılan Wait iş parçacığı, kilidi tutan bir iş parçacığı çağırana PulseAllkadar bekleme kuyruğunda kalır veya kuyrukta bir sonraki iş parçacığıdır ve kilidi tutan bir iş parçacığı çağırır Pulse. Ancak, başka bir iş parçacığı bu nesnenin Pulse veya PulseAll yöntemini çağırmadan önce milisaniye sürersetimeout, özgün iş parçacığı kilidi yeniden kazanmak için hazır kuyruğa taşınır.

Not

parametresi için timeout -1 milisaniyeyi temsil eden bir TimeSpan belirtilirse, kilit sahibi veya PulseAllçağrısı Pulse yapmadığı sürece bu yöntem süresiz olarak engeller. 0 milisaniye ise timeout çağıran Wait iş parçacığı kilidi serbest bırakır ve kilidi yeniden kazanmak için hemen hazır kuyruğa girer.

Çağıran, belirtilen nesne için kaç kez Enter çağrıldığından bağımsız olarak bir kez yürütülürWait. Kavramsal olarak, Wait yöntemi çağıranın nesnede kaç kez çağırıldığını Enter depolar Exit ve kilitli nesneyi tam olarak serbest bırakmak için gerektiği kadar çağrır. Çağıran daha sonra nesneyi yeniden almak için beklerken engeller. Çağıran kilidi yeniden aradığında sistem, arayan için kaydedilen Enter sayıyı geri yüklemek için gerektiği kadar çok kez çağırırEnter. Çağrısı Wait yalnızca belirtilen nesnenin kilidini serbest bırakır; çağıran diğer nesnelerdeki kilitlerin sahibiyse, bu kilitler serbest bırakılmaz.

Not

Eşitlenmiş bir nesne, kilit tutan iş parçacığına başvuru, kilidi almaya hazır iş parçacıklarını içeren hazır kuyruğa başvuru ve nesnenin durumundaki bir değişiklik bildirimini bekleyen iş parçacıklarını içeren bekleme kuyruğuna başvuru da dahil olmak üzere çeşitli başvuruları içerir.

Pulse, PulseAllve Wait yöntemleri eşitlenmiş bir kod bloğu içinden çağrılmalıdır.

yöntemine yönelik Pulse açıklamalar, bekleyen bir iş parçacığı olmadığında çağrılırsa Pulse ne olacağını açıklar.

Bağlamdan çıkma

exitContext yöntemi, bilinmeyen bir yönetilen bağlamın Wait içinden çağrılmadığı sürece parametresinin hiçbir etkisi yoktur. İş parçacığınız öğesinden ContextBoundObjecttüretilen bir sınıfın örneğine yönelik bir çağrının içindeyse bu durum oluşabilir. Şu anda gibi öğesinden ContextBoundObjectStringtüretilmemiş bir sınıfta bir yöntem yürütüyor olsanız bile, geçerli uygulama etki alanındaki yığınınızda bir varsaContextBoundObject, farklı bir bağlamda olabilirsiniz.

Kodunuz bilinmeyen bir bağlamda yürütülürken öğesinin belirtilmesi trueexitContext , yöntemini yürütmeden Wait önce iş parçacığının bilinmeyen yönetilen bağlamdan (yani varsayılan bağlama geçiş) çıkmasına neden olur. Yöntemine yapılan çağrı Wait tamamlandıktan sonra özgün zaman aşımına neden olmayan bağlama döner.

Bağlama bağlı sınıfın özniteliği uygulandığında SynchronizationAttribute bu yararlı olabilir. Bu durumda, sınıfın üyelerine yapılan tüm çağrılar otomatik olarak eşitlenir ve eşitleme etki alanı sınıfın kod gövdesinin tamamıdır. Bir üyenin çağrı yığınındaki kod yöntemini çağırır Wait ve için exitContextbelirtirsetrue, iş parçacığı eşitleme etki alanından çıkar ve nesnenin herhangi bir üyesine yapılan çağrıda engellenen bir iş parçacığının devam etmesine olanak sağlar. Yöntemi döndürdüğünde Wait , çağrıyı yapan iş parçacığının eşitleme etki alanını yeniden eklemek için beklemesi gerekir.