Aracılığıyla paylaş


WaitHandle Sınıf

Tanım

Paylaşılan kaynaklara özel erişim bekleyen işletim sistemine özgü nesneleri kapsüller.

public ref class WaitHandle abstract : IDisposable
public ref class WaitHandle abstract : MarshalByRefObject, IDisposable
public abstract class WaitHandle : IDisposable
public abstract class WaitHandle : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class WaitHandle : MarshalByRefObject, IDisposable
type WaitHandle = class
    interface IDisposable
type WaitHandle = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type WaitHandle = class
    inherit MarshalByRefObject
    interface IDisposable
Public MustInherit Class WaitHandle
Implements IDisposable
Public MustInherit Class WaitHandle
Inherits MarshalByRefObject
Implements IDisposable
Devralma
WaitHandle
Devralma
Türetilmiş
Öznitelikler
Uygulamalar

Örnekler

Aşağıdaki kod örneği, main iş parçacığı statik ve WaitAll sınıfın yöntemlerini kullanarak görevlerin tamamlanmasını beklerken iki iş parçacığının WaitAnyWaitHandle arka plan görevlerini nasıl gerçekleştirebileceğini gösterir.

using System;
using System.Threading;

public sealed class App
{
    // Define an array with two AutoResetEvent WaitHandles.
    static WaitHandle[] waitHandles = new WaitHandle[]
    {
        new AutoResetEvent(false),
        new AutoResetEvent(false)
    };

    // Define a random number generator for testing.
    static Random r = new Random();

    static void Main()
    {
        // Queue up two tasks on two different threads;
        // wait until all tasks are completed.
        DateTime dt = DateTime.Now;
        Console.WriteLine("Main thread is waiting for BOTH tasks to complete.");
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
        WaitHandle.WaitAll(waitHandles);
        // The time shown below should match the longest task.
        Console.WriteLine("Both tasks are completed (time waited={0})",
            (DateTime.Now - dt).TotalMilliseconds);

        // Queue up two tasks on two different threads;
        // wait until any task is completed.
        dt = DateTime.Now;
        Console.WriteLine();
        Console.WriteLine("The main thread is waiting for either task to complete.");
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
        int index = WaitHandle.WaitAny(waitHandles);
        // The time shown below should match the shortest task.
        Console.WriteLine("Task {0} finished first (time waited={1}).",
            index + 1, (DateTime.Now - dt).TotalMilliseconds);
    }

    static void DoTask(Object state)
    {
        AutoResetEvent are = (AutoResetEvent) state;
        int time = 1000 * r.Next(2, 10);
        Console.WriteLine("Performing a task for {0} milliseconds.", time);
        Thread.Sleep(time);
        are.Set();
    }
}

// This code produces output similar to the following:
//
//  Main thread is waiting for BOTH tasks to complete.
//  Performing a task for 7000 milliseconds.
//  Performing a task for 4000 milliseconds.
//  Both tasks are completed (time waited=7064.8052)
//
//  The main thread is waiting for either task to complete.
//  Performing a task for 2000 milliseconds.
//  Performing a task for 2000 milliseconds.
//  Task 1 finished first (time waited=2000.6528).
Imports System.Threading

NotInheritable Public Class App
    ' Define an array with two AutoResetEvent WaitHandles.
    Private Shared waitHandles() As WaitHandle = _
        {New AutoResetEvent(False), New AutoResetEvent(False)}
    
    ' Define a random number generator for testing.
    Private Shared r As New Random()
    
    <MTAThreadAttribute> _
    Public Shared Sub Main() 
        ' Queue two tasks on two different threads; 
        ' wait until all tasks are completed.
        Dim dt As DateTime = DateTime.Now
        Console.WriteLine("Main thread is waiting for BOTH tasks to complete.")
        ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0))
        ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1))
        WaitHandle.WaitAll(waitHandles)
        ' The time shown below should match the longest task.
        Console.WriteLine("Both tasks are completed (time waited={0})", _
            (DateTime.Now - dt).TotalMilliseconds)
        
        ' Queue up two tasks on two different threads; 
        ' wait until any tasks are completed.
        dt = DateTime.Now
        Console.WriteLine()
        Console.WriteLine("The main thread is waiting for either task to complete.")
        ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0))
        ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1))
        Dim index As Integer = WaitHandle.WaitAny(waitHandles)
        ' The time shown below should match the shortest task.
        Console.WriteLine("Task {0} finished first (time waited={1}).", _
            index + 1,(DateTime.Now - dt).TotalMilliseconds)
    
    End Sub
    
    Shared Sub DoTask(ByVal state As [Object]) 
        Dim are As AutoResetEvent = CType(state, AutoResetEvent)
        Dim time As Integer = 1000 * r.Next(2, 10)
        Console.WriteLine("Performing a task for {0} milliseconds.", time)
        Thread.Sleep(time)
        are.Set()
    
    End Sub
End Class

' This code produces output similar to the following:
'
'  Main thread is waiting for BOTH tasks to complete.
'  Performing a task for 7000 milliseconds.
'  Performing a task for 4000 milliseconds.
'  Both tasks are completed (time waited=7064.8052)
' 
'  The main thread is waiting for either task to complete.
'  Performing a task for 2000 milliseconds.
'  Performing a task for 2000 milliseconds.
'  Task 1 finished first (time waited=2000.6528).

Açıklamalar

WaitHandle sınıfı yerel bir işletim sistemi eşitleme tutamacını kapsüller ve çalışma zamanındaki birden çok bekleme işlemine izin veren tüm eşitleme nesnelerini temsil etmek için kullanılır. Bekleme tutamaçlarının diğer eşitleme nesneleriyle karşılaştırması için bkz. Eşitleme Temel Bilgilerine Genel Bakış.

Sınıfın WaitHandle kendisi soyut. öğesinden WaitHandle türetilen sınıflar, paylaşılan bir kaynağa erişim almayı veya erişimi serbest bırakmayı belirten bir sinyal mekanizması tanımlar, ancak paylaşılan kaynaklara erişim beklerken engellemek için devralınan WaitHandle yöntemleri kullanır. Türetilen WaitHandle sınıflar şunlardır:

İş parçacıkları, öğesinden türetilen sınıflar tarafından devralınan örnek yöntemini WaitOneçağırarak tek bir bekleme tutamacını WaitHandleengelleyebilir.

türetilmiş sınıfları WaitHandle , iş parçacığı benzitesinde farklılık gösterir. Olay bekleme tutamaçları (EventWaitHandle, AutoResetEventve ManualResetEvent) ve semaforların iş parçacığı benzitesi yoktur; herhangi bir iş parçacığı bir olay bekleme tutamacını veya semaforu işaret edebilir. Öte yandan, mutexlerin iş parçacığı benzitesi vardır; bir mutex'e sahip olan iş parçacığı bunu serbest bırakmalıdır ve bir iş parçacığı sahip olmadığı bir mutex üzerinde yöntemini çağırırsa ReleaseMutex bir özel durum oluşturulur.

WaitHandle sınıfı öğesinden MarshalByRefObjecttüretildiği için, bu sınıflar uygulama etki alanı sınırları arasında iş parçacıklarının etkinliklerini eşitlemek için kullanılabilir.

Türetilmiş sınıflarına ek olarak, WaitHandle sınıfı bir veya daha fazla eşitleme nesnesi sinyal alıncaya kadar bir iş parçacığını engelleyen bir dizi statik yönteme sahiptir. Bunlar şunları içerir:

  • SignalAndWait, bir iş parçacığının bir bekleme tutamacını işaret etmesini ve hemen diğerini beklemesini sağlar.

  • WaitAll, bir dizideki tüm bekleme tutamaçları sinyal alıncaya kadar bir iş parçacığının beklemesine olanak tanır.

  • WaitAny, bir iş parçacığının belirtilen bekleme tutamaçlarından herhangi biri sinyal verilene kadar beklemesine olanak tanır.

Bu yöntemlerin aşırı yüklemeleri, beklemeyi bırakmak için zaman aşımı aralıkları ve beklemeyi girmeden önce bir eşitleme bağlamından çıkma fırsatı sağlayarak diğer iş parçacıklarının eşitleme bağlamını kullanmasına olanak sağlar.

Önemli

Bu tür IDisposable arabirimini uygular. Türü veya türetilmiş bir türü kullanmayı bitirdiğinizde, doğrudan veya dolaylı olarak atmalısınız. Türü doğrudan atabilmek için, bir Closetry/ bloğunda catch yöntemini çağırın. Bunu dolaylı olarak atmak için using (C#'de) veya Using (Visual Basic'te) gibi bir dil yapısı kullanın. Daha fazla bilgi için arabirim konusunun "IDisposable Uygulayan Bir Nesne Kullanma" bölümüne IDisposable bakın.

WaitHandle deseni Dispose uygular. Bkz . Dispose yöntemi uygulama. 'den WaitHandletüretdiğinizde, yerel işletim sistemi tanıtıcınızı depolamak için özelliğini kullanın SafeWaitHandle . Yönetilmeyen ek kaynaklar kullanmadığınız sürece korumalı Dispose yöntemi geçersiz kılmanız gerekmez.

Oluşturucular

Name Description
WaitHandle()

WaitHandle sınıfının yeni bir örneğini başlatır.

Alanlar

Name Description
InvalidHandle

Geçersiz bir yerel işletim sistemi tutamacını temsil eder. Bu alan salt okunurdur.

WaitTimeout

Bekleme tutamaçlarından herhangi biri işaretlenmeden önce bir WaitAny(WaitHandle[], Int32, Boolean) işlemin zaman aşımına uğramasını gösterir. Bu alan sabittir.

Özellikler

Name Description
Handle
Geçersiz.
Geçersiz.

Yerel işletim sistemi tutamacını alır veya ayarlar.

SafeWaitHandle

Yerel işletim sistemi tutamacını alır veya ayarlar.

Yöntemler

Name Description
Close()

Geçerli WaitHandletarafından tutulan tüm kaynakları serbest bırakır.

CreateObjRef(Type)

Uzak bir nesneyle iletişim kurmak için kullanılan bir ara sunucu oluşturmak için gereken tüm ilgili bilgileri içeren bir nesne oluşturur.

(Devralındığı yer: MarshalByRefObject)
Dispose()

Sınıfın geçerli örneği WaitHandle tarafından kullanılan tüm kaynakları serbest bırakır.

Dispose(Boolean)

Türetilmiş bir sınıfta geçersiz kılındığında, tarafından WaitHandlekullanılan yönetilmeyen kaynakları serbest bırakır ve isteğe bağlı olarak yönetilen kaynakları serbest bırakır.

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

(Devralındığı yer: Object)
Finalize()

Geçerli örnek tarafından tutulan kaynakları serbest bırakır.

GetHashCode()

Varsayılan karma işlevi işlevi görür.

(Devralındığı yer: Object)
GetLifetimeService()
Geçersiz.

Bu örnek için yaşam süresi ilkesini denetleen geçerli yaşam süresi hizmet nesnesini alır.

(Devralındığı yer: MarshalByRefObject)
GetType()

Geçerli örneğin Type alır.

(Devralındığı yer: Object)
InitializeLifetimeService()
Geçersiz.

Bu örneğin yaşam süresi ilkesini denetlemek için bir yaşam süresi hizmet nesnesi alır.

(Devralındığı yer: MarshalByRefObject)
MemberwiseClone()

Geçerli Objectbasit bir kopyasını oluşturur.

(Devralındığı yer: Object)
MemberwiseClone(Boolean)

Geçerli MarshalByRefObject nesnenin sığ bir kopyasını oluşturur.

(Devralındığı yer: MarshalByRefObject)
SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean)

Bir sinyal WaitHandle gönderir ve diğerinde bekler, zaman aşımı aralığını 32 bit işaretli bir tamsayı olarak belirtir ve beklemeye girmeden önce bağlam için eşitleme etki alanından çıkılıp çıkılmayacağını belirtir.

SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean)

Bir sinyal gönderir WaitHandle ve diğerinde bekler, zaman aşımı aralığını olarak TimeSpan belirtir ve beklemeye girmeden önce bağlam için eşitleme etki alanından çıkılıp çıkılmayacağını belirtir.

SignalAndWait(WaitHandle, WaitHandle)

Bir sinyal WaitHandle alır ve diğerini bekler.

ToString()

Geçerli nesneyi temsil eden bir dize döndürür.

(Devralındığı yer: Object)
WaitAll(WaitHandle[], Int32, Boolean)

Belirtilen dizideki tüm öğelerin sinyal almasını bekler; zaman aralığını belirtmek için bir Int32 değer kullanarak ve beklemeden önce eşitleme etki alanından çıkılıp çıkılmayacağını belirtir.

WaitAll(WaitHandle[], Int32)

Zaman aralığını belirtmek için bir Int32 değer kullanarak belirtilen dizideki tüm öğelerin sinyal almasını bekler.

WaitAll(WaitHandle[], TimeSpan, Boolean)

Belirtilen dizideki tüm öğelerin sinyal almasını bekler, zaman aralığını belirtmek için bir TimeSpan değer kullanarak ve beklemeden önce eşitleme etki alanından çıkılıp çıkılmayacağını belirtir.

WaitAll(WaitHandle[], TimeSpan)

Zaman aralığını belirtmek için bir TimeSpan değer kullanarak belirtilen dizideki tüm öğelerin sinyal almasını bekler.

WaitAll(WaitHandle[])

Belirtilen dizideki tüm öğelerin sinyal almasını bekler.

WaitAny(WaitHandle[], Int32, Boolean)

Belirtilen dizideki öğelerin herhangi birinin sinyal almasını bekler; zaman aralığını belirtmek için 32 bit imzalı bir tamsayı kullanarak ve beklemeden önce eşitleme etki alanından çıkılıp çıkılmayacağını belirtir.

WaitAny(WaitHandle[], Int32)

Belirtilen dizideki öğelerin herhangi birinin sinyal almasını bekler ve zaman aralığını belirtmek için 32 bit imzalı bir tamsayı kullanılır.

WaitAny(WaitHandle[], TimeSpan, Boolean)

Belirtilen dizideki öğelerden herhangi birinin sinyal almasını bekler; zaman aralığını belirtmek için kullanarak TimeSpan ve beklemeden önce eşitleme etki alanından çıkılıp çıkılmayacağını belirtir.

WaitAny(WaitHandle[], TimeSpan)

Belirtilen dizideki öğelerden herhangi birinin sinyal almasını bekler ve zaman aralığını belirtmek için bir TimeSpan kullanılır.

WaitAny(WaitHandle[])

Belirtilen dizideki öğelerden herhangi birinin sinyal almasını bekler.

WaitOne()

Geçerli iş parçacığını, geçerli WaitHandle bir sinyal alıncaya kadar engeller.

WaitOne(Int32, Boolean)

Geçerli iş parçacığını, zaman aralığını belirtmek ve beklemeden önce eşitleme etki alanından çıkılıp çıkılmayacağını belirtmek için 32 bit imzalı bir tamsayı kullanarak bir WaitHandle sinyal alana kadar geçerli iş parçacığını engeller.

WaitOne(Int32)

Geçerli iş parçacığını, milisaniye cinsinden zaman aralığını belirtmek için 32 bit imzalı bir tamsayı kullanarak, geçerli WaitHandle iş parçacığını bir sinyal alana kadar engeller.

WaitOne(TimeSpan, Boolean)

Geçerli örnek bir sinyal alana kadar geçerli iş parçacığını engeller; zaman aralığını belirtmek için kullanarak TimeSpan ve beklemeden önce eşitleme etki alanından çıkılıp çıkılmayacağını belirtir.

WaitOne(TimeSpan)

Geçerli örnek bir sinyal alana kadar geçerli iş parçacığını engeller ve zaman aralığını belirtmek için bir TimeSpan kullanılır.

Belirtik Arabirim Kullanımları

Name Description
IDisposable.Dispose()

Bu API, ürün altyapısını destekler ve doğrudan kodunuzdan kullanıma yönelik değildir.

tarafından WaitHandlekullanılan tüm kaynakları serbest bırakır.

Uzantı Metotları

Name Description
GetSafeWaitHandle(WaitHandle)

Yerel işletim sistemi bekleme tutamacını güvenli tutamacını alır.

SetSafeWaitHandle(WaitHandle, SafeWaitHandle)

Yerel işletim sistemi bekleme tutamacı için güvenli bir tanıtıcı ayarlar.

Şunlara uygulanır

İş Parçacığı Güvenliği

Bu tür iş parçacığı güvenlidir.

Ayrıca bkz.