WaitHandle.WaitOne Yöntem

Tanım

Geçerli bir sinyal alana kadar geçerli iş parçacığını engeller WaitHandle .Blocks the current thread until the current WaitHandle receives a signal.

Aşırı Yüklemeler

WaitOne()

Geçerli bir sinyal alana kadar geçerli iş parçacığını engeller WaitHandle .Blocks the current thread until the current WaitHandle receives a signal.

WaitOne(Int32)

Geçerli iş parçacığını, geçerli bir sinyal alana kadar engeller WaitHandle ve zaman aralığını milisaniye olarak belirtmek için 32 bitlik işaretli bir tamsayı kullanın.Blocks the current thread until the current WaitHandle receives a signal, using a 32-bit signed integer to specify the time interval in milliseconds.

WaitOne(TimeSpan)

Geçerli örnek bir sinyal alıncaya kadar geçerli iş parçacığını engeller ve TimeSpan zaman aralığını belirtmek için bir kullanın.Blocks the current thread until the current instance receives a signal, using a TimeSpan to specify the time interval.

WaitOne(Int32, Boolean)

Geçerli bir sinyal alana kadar geçerli iş parçacığını engeller WaitHandle , zaman aralığını belirtmek için 32 bitlik işaretli bir tamsayı kullanarak ve bekleme öncesinde eşitleme etki alanından çıkmak isteyip istemediğinizi belirterek.Blocks the current thread until the current WaitHandle receives a signal, using a 32-bit signed integer to specify the time interval and specifying whether to exit the synchronization domain before the wait.

WaitOne(TimeSpan, Boolean)

Geçerli örnek bir sinyal alana kadar geçerli iş parçacığını engeller, TimeSpan zaman aralığını belirtmek için bir kullanarak ve bekleme öncesinde eşitleme etki alanından çıkmak isteyip istemediğinizi belirterek.Blocks the current thread until the current instance receives a signal, using a TimeSpan to specify the time interval and specifying whether to exit the synchronization domain before the wait.

WaitOne()

Geçerli bir sinyal alana kadar geçerli iş parçacığını engeller WaitHandle .Blocks the current thread until the current WaitHandle receives a signal.

public:
 virtual bool WaitOne();
public virtual bool WaitOne ();
abstract member WaitOne : unit -> bool
override this.WaitOne : unit -> bool
Public Overridable Function WaitOne () As Boolean

Döndürülenler

Boolean

true geçerli örnek bir sinyal alırsa.true if the current instance receives a signal. Geçerli örnek hiçbir şekilde sinyalse, WaitOne() hiçbir şekilde döndürmez.If the current instance is never signaled, WaitOne() never returns.

Özel durumlar

Geçerli örnek zaten atıldı.The current instance has already been disposed.

Bir iş parçacığı bir mutex serbest bırakılmadan çıkıldığından bekleme tamamlandı.The wait completed because a thread exited without releasing a mutex.

Geçerli örnek, WaitHandle başka bir uygulama etki alanındaki bir için saydam bir ara sunucu.The current instance is a transparent proxy for a WaitHandle in another application domain.

Örnekler

Aşağıdaki kod örneği bir işlemin, bir arka plan iş parçacığının yürütmeyi tamamlamasını beklediği sırada sonlandırılmasını sağlamak için bir bekleme tutamacının nasıl kullanılacağını gösterir.The following code example shows how to use a wait handle to keep a process from terminating while it waits for a background thread to finish executing.

using namespace System;
using namespace System::Threading;
ref class WaitOne
{
private:
   WaitOne(){}


public:
   static void WorkMethod( Object^ stateInfo )
   {
      Console::WriteLine( "Work starting." );
      
      // Simulate time spent working.
      Thread::Sleep( (gcnew Random)->Next( 100, 2000 ) );
      
      // Signal that work is finished.
      Console::WriteLine( "Work ending." );
      dynamic_cast<AutoResetEvent^>(stateInfo)->Set();
   }

};

int main()
{
   Console::WriteLine( "Main starting." );
   AutoResetEvent^ autoEvent = gcnew AutoResetEvent( false );
   ThreadPool::QueueUserWorkItem( gcnew WaitCallback( &WaitOne::WorkMethod ), autoEvent );
   
   // Wait for work method to signal.
   autoEvent->WaitOne(  );
   Console::WriteLine( "Work method signaled.\nMain ending." );
}

using System;
using System.Threading;

class WaitOne
{
    static AutoResetEvent autoEvent = new AutoResetEvent(false);

    static void Main()
    {
        Console.WriteLine("Main starting.");

        ThreadPool.QueueUserWorkItem(
            new WaitCallback(WorkMethod), autoEvent);

        // Wait for work method to signal.
        autoEvent.WaitOne();
        Console.WriteLine("Work method signaled.\nMain ending.");
    }

    static void WorkMethod(object stateInfo) 
    {
        Console.WriteLine("Work starting.");

        // Simulate time spent working.
        Thread.Sleep(new Random().Next(100, 2000));

        // Signal that work is finished.
        Console.WriteLine("Work ending.");
        ((AutoResetEvent)stateInfo).Set();
    }
}
Imports System.Threading

Public Class WaitOne

    Shared autoEvent As New AutoResetEvent(False)

    <MTAThread> _
    Shared Sub Main()
        Console.WriteLine("Main starting.")

        ThreadPool.QueueUserWorkItem(AddressOf WorkMethod, autoEvent)

        ' Wait for work method to signal.
        autoEvent.WaitOne()
        Console.WriteLine("Work method signaled.")
        Console.WriteLine("Main ending.")
    End Sub

    Shared Sub WorkMethod(stateInfo As Object) 
        Console.WriteLine("Work starting.")

        ' Simulate time spent working.
        Thread.Sleep(New Random().Next(100, 2000))

        ' Signal that work is finished.
        Console.WriteLine("Work ending.")
        CType(stateInfo, AutoResetEvent).Set()
    End Sub

End Class

Açıklamalar

AbandonedMutexException .NET Framework sürüm 2,0 ' de yenidir.AbandonedMutexException is new in the .NET Framework version 2.0. Önceki sürümlerde, WaitOne yöntemi true bir mutex terk edildiğinde döndürür.In previous versions, the WaitOne method returns true when a mutex is abandoned. Bırakılan mutex genellikle ciddi bir kodlama hatasını gösterir.An abandoned mutex often indicates a serious coding error. Sistem genelinde bir mutex söz konusu olduğunda, bir uygulamanın aniden sonlandırıldığı (örneğin, Windows Görev Yöneticisi 'ni kullanarak) göstergesi olabilir.In the case of a system-wide mutex, it might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager). Özel durum, hata ayıklama için yararlı bilgiler içerir.The exception contains information useful for debugging.

Bu yöntemin çağıranı, geçerli örnek bir sinyal alıncaya kadar süresiz olarak engeller.The caller of this method blocks indefinitely until the current instance receives a signal. WaitHandleZaman uyumsuz bir işlem tamamlandığında oluşturulduğu gibi başka bir iş parçacığından bir sinyal alana kadar engellemek için bu yöntemi kullanın.Use this method to block until a WaitHandle receives a signal from another thread, such as is generated when an asynchronous operation completes. Daha fazla bilgi için arabirimine bakın IAsyncResult .For more information, see the IAsyncResult interface.

Bu yöntem aşırı yüklemesini çağırmak, WaitOne(Int32, Boolean) yöntem aşırı yüklemesini çağırma ve-1 ya da Timeout.Infinite ilk parametre için ve false ikinci parametre için eşdeğerdir.Calling this method overload is equivalent to calling the WaitOne(Int32, Boolean) method overload and specifying -1 or Timeout.Infinite for the first parameter and false for the second parameter.

Türetilmiş sınıfların davranışını özelleştirmek için bu yöntemi geçersiz kılın.Override this method to customize the behavior of derived classes.

Şunlara uygulanır

WaitOne(Int32)

Geçerli iş parçacığını, geçerli bir sinyal alana kadar engeller WaitHandle ve zaman aralığını milisaniye olarak belirtmek için 32 bitlik işaretli bir tamsayı kullanın.Blocks the current thread until the current WaitHandle receives a signal, using a 32-bit signed integer to specify the time interval in milliseconds.

public:
 virtual bool WaitOne(int millisecondsTimeout);
public virtual bool WaitOne (int millisecondsTimeout);
abstract member WaitOne : int -> bool
override this.WaitOne : int -> bool
Public Overridable Function WaitOne (millisecondsTimeout As Integer) As Boolean

Parametreler

millisecondsTimeout
Int32

Süresiz olarak beklenecek, beklenecek milisaniye sayısı veya Infinite (-1).The number of milliseconds to wait, or Infinite (-1) to wait indefinitely.

Döndürülenler

Boolean

true geçerli örnek bir sinyal alırsa; Aksi takdirde, false .true if the current instance receives a signal; otherwise, false.

Özel durumlar

Geçerli örnek zaten atıldı.The current instance has already been disposed.

millisecondsTimeout sonsuz bir zaman aşımını temsil eden-1 dışında negatif bir sayıdır.millisecondsTimeout is a negative number other than -1, which represents an infinite time-out.

Bir iş parçacığı bir mutex serbest bırakılmadan çıkıldığından bekleme tamamlandı.The wait completed because a thread exited without releasing a mutex.

Geçerli örnek, WaitHandle başka bir uygulama etki alanındaki bir için saydam bir ara sunucu.The current instance is a transparent proxy for a WaitHandle in another application domain.

Örnekler

Aşağıdaki kod örneği bir işlemin, bir arka plan iş parçacığının yürütmeyi tamamlamasını beklediği sırada sonlandırılmasını sağlamak için bir bekleme tutamacının nasıl kullanılacağını gösterir.The following code example shows how to use a wait handle to keep a process from terminating while it waits for a background thread to finish executing.

using namespace System;
using namespace System::Threading;
ref class WaitOne
{
private:
   WaitOne(){}


public:
   static void WorkMethod( Object^ stateInfo )
   {
      Console::WriteLine( "Work starting." );
      
      // Simulate time spent working.
      Thread::Sleep( (gcnew Random)->Next( 100, 2000 ) );
      
      // Signal that work is finished.
      Console::WriteLine( "Work ending." );
      dynamic_cast<AutoResetEvent^>(stateInfo)->Set();
   }

};

int main()
{
   Console::WriteLine( "Main starting." );
   AutoResetEvent^ autoEvent = gcnew AutoResetEvent( false );
   ThreadPool::QueueUserWorkItem( gcnew WaitCallback( &WaitOne::WorkMethod ), autoEvent );
   
   // Wait for work method to signal.
   if ( autoEvent->WaitOne( 1000 ) )
   {
      Console::WriteLine( "Work method signaled." );
   }
   else
   {
      Console::WriteLine( "Timed out waiting for work "
      "method to signal." );
   }

   Console::WriteLine( "Main ending." );
}

using System;
using System.Threading;

class WaitOne
{
    static AutoResetEvent autoEvent = new AutoResetEvent(false);

    static void Main()
    {
        Console.WriteLine("Main starting.");

        ThreadPool.QueueUserWorkItem(
            new WaitCallback(WorkMethod), autoEvent);

        // Wait for work method to signal.
        if(autoEvent.WaitOne(1000))
        {
            Console.WriteLine("Work method signaled.");
        }
        else
        {
            Console.WriteLine("Timed out waiting for work " +
                "method to signal.");
        }
        Console.WriteLine("Main ending.");
    }

    static void WorkMethod(object stateInfo) 
    {
        Console.WriteLine("Work starting.");

        // Simulate time spent working.
        Thread.Sleep(new Random().Next(100, 2000));

        // Signal that work is finished.
        Console.WriteLine("Work ending.");
        ((AutoResetEvent)stateInfo).Set();
    }
}
Imports System.Threading

Public Class WaitOne

    Shared autoEvent As New AutoResetEvent(False)

    <MTAThread> _
    Shared Sub Main()
        Console.WriteLine("Main starting.")

        ThreadPool.QueueUserWorkItem(AddressOf WorkMethod, autoEvent)

        ' Wait for work method to signal.
        If autoEvent.WaitOne(1000) Then
            Console.WriteLine("Work method signaled.")
        Else
            Console.WriteLine("Timed out waiting for work " & _
                "method to signal.")
        End If

        Console.WriteLine("Main ending.")
    End Sub

    Shared Sub WorkMethod(stateInfo As Object) 
        Console.WriteLine("Work starting.")

        ' Simulate time spent working.
        Thread.Sleep(New Random().Next(100, 2000))

        ' Signal that work is finished.
        Console.WriteLine("Work ending.")
        CType(stateInfo, AutoResetEvent).Set()
    End Sub

End Class

Açıklamalar

millisecondsTimeoutSıfırsa, yöntemi engellemez.If millisecondsTimeout is zero, the method does not block. Bekleme tutamacının durumunu sınar ve hemen döndürür.It tests the state of the wait handle and returns immediately.

Bu yöntem, geçerli örnek bir sinyal alıncaya veya bir zaman aşımı gerçekleşene kadar engeller.The caller of this method blocks until the current instance receives a signal or a time-out occurs. WaitHandleZaman uyumsuz bir işlem tamamlandığında oluşturulduğu gibi başka bir iş parçacığından bir sinyal alana kadar engellemek için bu yöntemi kullanın.Use this method to block until a WaitHandle receives a signal from another thread, such as is generated when an asynchronous operation completes. Daha fazla bilgi için arabirimine bakın IAsyncResult .For more information, see the IAsyncResult interface.

Türetilmiş sınıfların davranışını özelleştirmek için bu yöntemi geçersiz kılın.Override this method to customize the behavior of derived classes.

Bu yöntem aşırı yüklemesini çağırmak, WaitOne(Int32, Boolean) aşırı yüklemeyi çağırma ve için belirtme ile false aynıdır exitContext .Calling this method overload is the same as calling the WaitOne(Int32, Boolean) overload and specifying false for exitContext.

Şunlara uygulanır

WaitOne(TimeSpan)

Geçerli örnek bir sinyal alıncaya kadar geçerli iş parçacığını engeller ve TimeSpan zaman aralığını belirtmek için bir kullanın.Blocks the current thread until the current instance receives a signal, using a TimeSpan to specify the time interval.

public:
 virtual bool WaitOne(TimeSpan timeout);
public virtual bool WaitOne (TimeSpan timeout);
abstract member WaitOne : TimeSpan -> bool
override this.WaitOne : TimeSpan -> bool
Public Overridable Function WaitOne (timeout As TimeSpan) As Boolean

Parametreler

timeout
TimeSpan

TimeSpanBeklenmesi gereken milisaniye sayısını veya TimeSpan süresiz olarak beklenecek-1 milisaniyeyi temsil eden bir.A TimeSpan that represents the number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely.

Döndürülenler

Boolean

true geçerli örnek bir sinyal alırsa; Aksi takdirde, false .true if the current instance receives a signal; otherwise, false.

Özel durumlar

Geçerli örnek zaten atıldı.The current instance has already been disposed.

timeout sonsuz bir zaman aşımını temsil eden-1 milisaniyelik dışında negatif bir sayıdır.timeout is a negative number other than -1 milliseconds, which represents an infinite time-out. -veya--or- timeout Şundan büyüktür MaxValue .timeout is greater than MaxValue.

Bir iş parçacığı bir mutex serbest bırakılmadan çıkıldığından bekleme tamamlandı.The wait completed because a thread exited without releasing a mutex.

Geçerli örnek, WaitHandle başka bir uygulama etki alanındaki bir için saydam bir ara sunucu.The current instance is a transparent proxy for a WaitHandle in another application domain.

Açıklamalar

timeoutSıfırsa, yöntemi engellemez.If timeout is zero, the method does not block. Bekleme tutamacının durumunu sınar ve hemen döndürür.It tests the state of the wait handle and returns immediately.

Bu yöntem, geçerli örnek bir sinyal alıncaya veya bir zaman aşımı gerçekleşene kadar engeller.The caller of this method blocks until the current instance receives a signal or a time-out occurs. WaitHandleZaman uyumsuz bir işlem tamamlandığında oluşturulduğu gibi başka bir iş parçacığından bir sinyal alana kadar engellemek için bu yöntemi kullanın.Use this method to block until a WaitHandle receives a signal from another thread, such as is generated when an asynchronous operation completes. Daha fazla bilgi için arabirimine bakın IAsyncResult .For more information, see the IAsyncResult interface.

Türetilmiş sınıfların davranışını özelleştirmek için bu yöntemi geçersiz kılın.Override this method to customize the behavior of derived classes.

İçin en büyük değer timeout Int32.MaxValue .The maximum value for timeout is Int32.MaxValue.

Bu yöntem aşırı yüklemesini çağırmak, WaitOne(TimeSpan, Boolean) aşırı yüklemeyi çağırma ve için belirtme ile false aynıdır exitContext .Calling this method overload is the same as calling the WaitOne(TimeSpan, Boolean) overload and specifying false for exitContext.

Şunlara uygulanır

WaitOne(Int32, Boolean)

Geçerli bir sinyal alana kadar geçerli iş parçacığını engeller WaitHandle , zaman aralığını belirtmek için 32 bitlik işaretli bir tamsayı kullanarak ve bekleme öncesinde eşitleme etki alanından çıkmak isteyip istemediğinizi belirterek.Blocks the current thread until the current WaitHandle receives a signal, using a 32-bit signed integer to specify the time interval and specifying whether to exit the synchronization domain before the wait.

public:
 virtual bool WaitOne(int millisecondsTimeout, bool exitContext);
public virtual bool WaitOne (int millisecondsTimeout, bool exitContext);
abstract member WaitOne : int * bool -> bool
override this.WaitOne : int * bool -> bool
Public Overridable Function WaitOne (millisecondsTimeout As Integer, exitContext As Boolean) As Boolean

Parametreler

millisecondsTimeout
Int32

Süresiz olarak beklenecek, beklenecek milisaniye sayısı veya Infinite (-1).The number of milliseconds to wait, or Infinite (-1) to wait indefinitely.

exitContext
Boolean

true eşitlemeden önce bağlam için eşitleme etki alanından çıkmak için (eşitlenen bir bağlamda varsa) ve daha sonra yeniden alın; Aksi takdirde, false .true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it afterward; otherwise, false.

Döndürülenler

Boolean

true geçerli örnek bir sinyal alırsa; Aksi takdirde, false .true if the current instance receives a signal; otherwise, false.

Özel durumlar

Geçerli örnek zaten atıldı.The current instance has already been disposed.

millisecondsTimeout sonsuz bir zaman aşımını temsil eden-1 dışında negatif bir sayıdır.millisecondsTimeout is a negative number other than -1, which represents an infinite time-out.

Bir iş parçacığı bir mutex serbest bırakılmadan çıkıldığından bekleme tamamlandı.The wait completed because a thread exited without releasing a mutex.

Geçerli örnek, WaitHandle başka bir uygulama etki alanındaki bir için saydam bir ara sunucu.The current instance is a transparent proxy for a WaitHandle in another application domain.

Örnekler

Aşağıdaki örnek, WaitOne(Int32, Boolean) bir eşitleme etki alanı içinde çağrıldığında yöntem aşırı yüklemesinin nasıl davranacağını gösterir.The following example shows how the WaitOne(Int32, Boolean) method overload behaves when it is called within a synchronization domain. İlk olarak, bir iş parçacığı exitContext false bekleme zaman aşımı süresi dolana kadar olarak ayarla ve bloklar ile bekler.First, a thread waits with exitContext set to false and blocks until the wait timeout expires. İkinci bir iş parçacığı sonlandırıldıktan sonra çalışır ve exitContext olarak ayarla ' yı bekler true .A second thread executes after the first thread terminates and waits with exitContext set to true. Bu ikinci iş parçacığı için bekleme tanıtıcısına sinyal çağrısı engellenmiyor ve iş parçacığı bekleme zaman aşımından önce tamamlandı.The call to signal the wait handle for this second thread is not blocked, and the thread completes before the wait timeout.

using namespace System;
using namespace System::Threading;
using namespace System::Runtime::Remoting::Contexts;

[Synchronization(true)]
public ref class SyncingClass : ContextBoundObject
{
private:
    EventWaitHandle^ waitHandle;

public:
    SyncingClass()
    {
         waitHandle =
            gcnew EventWaitHandle(false, EventResetMode::ManualReset);
    }

    void Signal()
    {
        Console::WriteLine("Thread[{0:d4}]: Signalling...", Thread::CurrentThread->GetHashCode());
        waitHandle->Set();
    }

    void DoWait(bool leaveContext)
    {
        bool signalled;

        waitHandle->Reset();
        Console::WriteLine("Thread[{0:d4}]: Waiting...", Thread::CurrentThread->GetHashCode());
        signalled = waitHandle->WaitOne(3000, leaveContext);
        if (signalled)
        {
            Console::WriteLine("Thread[{0:d4}]: Wait released!!!", Thread::CurrentThread->GetHashCode());
        }
        else
        {
            Console::WriteLine("Thread[{0:d4}]: Wait timeout!!!", Thread::CurrentThread->GetHashCode());
        }
    }
};

public ref class TestSyncDomainWait
{
public:
    static void Main()
    {
        SyncingClass^ syncClass = gcnew SyncingClass();

        Thread^ runWaiter;

        Console::WriteLine("\nWait and signal INSIDE synchronization domain:\n");
        runWaiter = gcnew Thread(gcnew ParameterizedThreadStart(&TestSyncDomainWait::RunWaitKeepContext));
        runWaiter->Start(syncClass);
        Thread::Sleep(1000);
        Console::WriteLine("Thread[{0:d4}]: Signal...", Thread::CurrentThread->GetHashCode());
        // This call to Signal will block until the timeout in DoWait expires.
        syncClass->Signal();
        runWaiter->Join();

        Console::WriteLine("\nWait and signal OUTSIDE synchronization domain:\n");
        runWaiter = gcnew Thread(gcnew ParameterizedThreadStart(&TestSyncDomainWait::RunWaitLeaveContext));
        runWaiter->Start(syncClass);
        Thread::Sleep(1000);
        Console::WriteLine("Thread[{0:d4}]: Signal...", Thread::CurrentThread->GetHashCode());
        // This call to Signal is unblocked and will set the wait handle to
        // release the waiting thread.
        syncClass->Signal();
        runWaiter->Join();
    }

    static void RunWaitKeepContext(Object^ parm)
    {
        ((SyncingClass^)parm)->DoWait(false);
    }

    static void RunWaitLeaveContext(Object^ parm)
    {
        ((SyncingClass^)parm)->DoWait(true);
    }
};

int main()
{
    TestSyncDomainWait::Main();
}
// The output for the example program will be similar to the following:
//
// Wait and signal INSIDE synchronization domain:
//
// Thread[0004]: Waiting...
// Thread[0001]: Signal...
// Thread[0004]: Wait timeout!!!
// Thread[0001]: Signalling...
//
// Wait and signal OUTSIDE synchronization domain:
//
// Thread[0006]: Waiting...
// Thread[0001]: Signal...
// Thread[0001]: Signalling...
// Thread[0006]: Wait released!!!
using System;
using System.Threading;
using System.Runtime.Remoting.Contexts;

[Synchronization(true)]
public class SyncingClass : ContextBoundObject
{
    private EventWaitHandle waitHandle;

    public SyncingClass()
    {
         waitHandle =
            new EventWaitHandle(false, EventResetMode.ManualReset);
    }

    public void Signal()
    {
        Console.WriteLine("Thread[{0:d4}]: Signalling...", Thread.CurrentThread.GetHashCode());
        waitHandle.Set();
    }

    public void DoWait(bool leaveContext)
    {
        bool signalled;

        waitHandle.Reset();
        Console.WriteLine("Thread[{0:d4}]: Waiting...", Thread.CurrentThread.GetHashCode());
        signalled = waitHandle.WaitOne(3000, leaveContext);
        if (signalled)
        {
            Console.WriteLine("Thread[{0:d4}]: Wait released!!!", Thread.CurrentThread.GetHashCode());
        }
        else
        {
            Console.WriteLine("Thread[{0:d4}]: Wait timeout!!!", Thread.CurrentThread.GetHashCode());
        }
    }
}

public class TestSyncDomainWait
{
    public static void Main()
    {
        SyncingClass syncClass = new SyncingClass();

        Thread runWaiter;

        Console.WriteLine("\nWait and signal INSIDE synchronization domain:\n");
        runWaiter = new Thread(RunWaitKeepContext);
        runWaiter.Start(syncClass);
        Thread.Sleep(1000);
        Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode());
        // This call to Signal will block until the timeout in DoWait expires.
        syncClass.Signal();
        runWaiter.Join();

        Console.WriteLine("\nWait and signal OUTSIDE synchronization domain:\n");
        runWaiter = new Thread(RunWaitLeaveContext);
        runWaiter.Start(syncClass);
        Thread.Sleep(1000);
        Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode());
        // This call to Signal is unblocked and will set the wait handle to
        // release the waiting thread.
        syncClass.Signal();
        runWaiter.Join();
    }

    public static void RunWaitKeepContext(object parm)
    {
        ((SyncingClass)parm).DoWait(false);
    }

    public static void RunWaitLeaveContext(object parm)
    {
        ((SyncingClass)parm).DoWait(true);
    }
}

// The output for the example program will be similar to the following:
//
// Wait and signal INSIDE synchronization domain:
//
// Thread[0004]: Waiting...
// Thread[0001]: Signal...
// Thread[0004]: Wait timeout!!!
// Thread[0001]: Signalling...
//
// Wait and signal OUTSIDE synchronization domain:
//
// Thread[0006]: Waiting...
// Thread[0001]: Signal...
// Thread[0001]: Signalling...
// Thread[0006]: Wait released!!!
Imports System.Threading
Imports System.Runtime.Remoting.Contexts

<Synchronization(true)>
Public Class SyncingClass
    Inherits ContextBoundObject
    
    Private waitHandle As EventWaitHandle

    Public Sub New()
         waitHandle = New EventWaitHandle(false, EventResetMode.ManualReset)
    End Sub

    Public Sub Signal()
        Console.WriteLine("Thread[{0:d4}]: Signalling...", Thread.CurrentThread.GetHashCode())
        waitHandle.Set()
    End Sub

    Public Sub DoWait(leaveContext As Boolean)
        Dim signalled As Boolean

        waitHandle.Reset()
        Console.WriteLine("Thread[{0:d4}]: Waiting...", Thread.CurrentThread.GetHashCode())
        signalled = waitHandle.WaitOne(3000, leaveContext)
        If signalled Then
            Console.WriteLine("Thread[{0:d4}]: Wait released!!!", Thread.CurrentThread.GetHashCode())
        Else
            Console.WriteLine("Thread[{0:d4}]: Wait timeout!!!", Thread.CurrentThread.GetHashCode())
        End If
    End Sub
End Class

Public Class TestSyncDomainWait
    Public Shared Sub Main()
        Dim syncClass As New SyncingClass()

        Dim runWaiter As Thread

        Console.WriteLine(Environment.NewLine + "Wait and signal INSIDE synchronization domain:" + Environment.NewLine)
        runWaiter = New Thread(AddressOf RunWaitKeepContext)
        runWaiter.Start(syncClass)
        Thread.Sleep(1000)
        Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode())
        ' This call to Signal will block until the timeout in DoWait expires.
        syncClass.Signal()
        runWaiter.Join()

        Console.WriteLine(Environment.NewLine + "Wait and signal OUTSIDE synchronization domain:" + Environment.NewLine)
        runWaiter = New Thread(AddressOf RunWaitLeaveContext)
        runWaiter.Start(syncClass)
        Thread.Sleep(1000)
        Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode())
        ' This call to Signal is unblocked and will set the wait handle to
        ' release the waiting thread.
        syncClass.Signal()
        runWaiter.Join()
    End Sub

    Public Shared Sub RunWaitKeepContext(parm As Object)
        Dim syncClass As SyncingClass = CType(parm, SyncingClass)
        syncClass.DoWait(False)
    End Sub

    Public Shared Sub RunWaitLeaveContext(parm As Object)
        Dim syncClass As SyncingClass = CType(parm, SyncingClass)
        syncClass.DoWait(True)
    End Sub
End Class

' The output for the example program will be similar to the following:
'
' Wait and signal INSIDE synchronization domain:
'
' Thread[0004]: Waiting...
' Thread[0001]: Signal...
' Thread[0004]: Wait timeout!!!
' Thread[0001]: Signalling...
'
' Wait and signal OUTSIDE synchronization domain:
'
' Thread[0006]: Waiting...
' Thread[0001]: Signal...
' Thread[0001]: Signalling...
' Thread[0006]: Wait released!!!

Açıklamalar

millisecondsTimeoutSıfırsa, yöntemi engellemez.If millisecondsTimeout is zero, the method does not block. Bekleme tutamacının durumunu sınar ve hemen döndürür.It tests the state of the wait handle and returns immediately.

AbandonedMutexException .NET Framework sürüm 2,0 ' de yenidir.AbandonedMutexException is new in the .NET Framework version 2.0. Önceki sürümlerde, WaitOne yöntemi true bir mutex terk edildiğinde döndürür.In previous versions, the WaitOne method returns true when a mutex is abandoned. Bırakılan mutex genellikle ciddi bir kodlama hatasını gösterir.An abandoned mutex often indicates a serious coding error. Sistem genelinde bir mutex söz konusu olduğunda, bir uygulamanın aniden sonlandırıldığı (örneğin, Windows Görev Yöneticisi 'ni kullanarak) göstergesi olabilir.In the case of a system-wide mutex, it might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager). Özel durum, hata ayıklama için yararlı bilgiler içerir.The exception contains information useful for debugging.

Bu yöntem, geçerli örnek bir sinyal alıncaya veya bir zaman aşımı gerçekleşene kadar engeller.The caller of this method blocks until the current instance receives a signal or a time-out occurs. WaitHandleZaman uyumsuz bir işlem tamamlandığında oluşturulduğu gibi başka bir iş parçacığından bir sinyal alana kadar engellemek için bu yöntemi kullanın.Use this method to block until a WaitHandle receives a signal from another thread, such as is generated when an asynchronous operation completes. Daha fazla bilgi için arabirimine bakın IAsyncResult .For more information, see the IAsyncResult interface.

Türetilmiş sınıfların davranışını özelleştirmek için bu yöntemi geçersiz kılın.Override this method to customize the behavior of derived classes.

Bağlamdan Çıkmaya İlişkin NotlarNotes on Exiting the Context

exitContext WaitOne Yöntemi, varsayılan olarak yönetilen bir bağlamın içinden çağrılmamışsa parametrenin hiçbir etkisi yoktur.The exitContext parameter has no effect unless the WaitOne method is called from inside a nondefault managed context. Bu, İş parçacığınıza türetilmiş bir sınıfın örneğine yapılan bir çağrının içindeyse meydana gelebilir ContextBoundObject .This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Şu anda öğesinden türetilmeyen bir sınıf üzerinde bir yöntemi yürütseniz bile ContextBoundObject String , ContextBoundObject geçerli uygulama etki alanındaki yığınınızdan bir varsa, varsayılan dışı bir bağlamda olabilirsiniz.Even if you are currently executing a method on a class that does not derive from ContextBoundObject, like String, you can be in a nondefault context if a ContextBoundObject is on your stack in the current application domain.

Kodunuz, varsayılan olmayan bir bağlamda true yürütülmiyorsa, için belirtmek, exitContext iş parçacığının, yöntemi yürütmeden önce varsayılan olarak, varsayılan içeriğe geçiş yapmasına izin vermez WaitOne .When your code is executing in a nondefault context, specifying true for exitContext causes the thread to exit the nondefault managed context (that is, to transition to the default context) before executing the WaitOne method. İş parçacığı, yöntemi çağrısının tamamlanmasından sonra orijinal varsayılan olmayan içeriğe geri döner WaitOne .The thread returns to the original nondefault context after the call to the WaitOne method completes.

Bu, bağlam bağlantılı sınıf olduğunda yararlı olabilir SynchronizationAttribute .This can be useful when the context-bound class has SynchronizationAttribute. 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 için kodun tamamının gövdesidir.In that case, all calls to members of the class are automatically synchronized, and the synchronization domain is the entire body of code for the class. Bir üyenin Çağrı yığınındaki kod WaitOne yöntemini çağırır ve true için exitContext şunu belirtiyorsa, iş parçacığı eşitleme etki alanından çıkar ve nesnenin herhangi bir üyesine yönelik bir çağrıda engellenen bir iş parçacığının devam etmesini sağlar.If code in the call stack of a member calls the WaitOne method and specifies true for exitContext, the thread exits the synchronization domain, allowing a thread that is blocked on a call to any member of the object to proceed. WaitOneYöntem döndüğünde, çağrıyı yapan iş parçacığının eşitleme etki alanını yeniden girmesi gerekir.When the WaitOne method returns, the thread that made the call must wait to reenter the synchronization domain.

Şunlara uygulanır

WaitOne(TimeSpan, Boolean)

Geçerli örnek bir sinyal alana kadar geçerli iş parçacığını engeller, TimeSpan zaman aralığını belirtmek için bir kullanarak ve bekleme öncesinde eşitleme etki alanından çıkmak isteyip istemediğinizi belirterek.Blocks the current thread until the current instance receives a signal, using a TimeSpan to specify the time interval and specifying whether to exit the synchronization domain before the wait.

public:
 virtual bool WaitOne(TimeSpan timeout, bool exitContext);
public virtual bool WaitOne (TimeSpan timeout, bool exitContext);
abstract member WaitOne : TimeSpan * bool -> bool
override this.WaitOne : TimeSpan * bool -> bool
Public Overridable Function WaitOne (timeout As TimeSpan, exitContext As Boolean) As Boolean

Parametreler

timeout
TimeSpan

TimeSpanBeklenmesi gereken milisaniye sayısını veya TimeSpan süresiz olarak beklenecek-1 milisaniyeyi temsil eden bir.A TimeSpan that represents the number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely.

exitContext
Boolean

true eşitlemeden önce bağlam için eşitleme etki alanından çıkmak için (eşitlenen bir bağlamda varsa) ve daha sonra yeniden alın; Aksi takdirde, false .true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it afterward; otherwise, false.

Döndürülenler

Boolean

true geçerli örnek bir sinyal alırsa; Aksi takdirde, false .true if the current instance receives a signal; otherwise, false.

Özel durumlar

Geçerli örnek zaten atıldı.The current instance has already been disposed.

timeout sonsuz bir zaman aşımını temsil eden-1 milisaniyelik dışında negatif bir sayıdır.timeout is a negative number other than -1 milliseconds, which represents an infinite time-out. -veya--or- timeout Şundan büyüktür MaxValue .timeout is greater than MaxValue.

Bir iş parçacığı bir mutex serbest bırakılmadan çıkıldığından bekleme tamamlandı.The wait completed because a thread exited without releasing a mutex.

Geçerli örnek, WaitHandle başka bir uygulama etki alanındaki bir için saydam bir ara sunucu.The current instance is a transparent proxy for a WaitHandle in another application domain.

Örnekler

Aşağıdaki kod örneği bir işlemin, bir arka plan iş parçacığının yürütmeyi tamamlamasını beklediği sırada sonlandırılmasını sağlamak için bir bekleme tutamacının nasıl kullanılacağını gösterir.The following code example shows how to use a wait handle to keep a process from terminating while it waits for a background thread to finish executing.

using namespace System;
using namespace System::Threading;
ref class WaitOne
{
private:
   WaitOne(){}


public:
   static void WorkMethod( Object^ stateInfo )
   {
      Console::WriteLine( "Work starting." );
      
      // Simulate time spent working.
      Thread::Sleep( (gcnew Random)->Next( 100, 2000 ) );
      
      // Signal that work is finished.
      Console::WriteLine( "Work ending." );
      dynamic_cast<AutoResetEvent^>(stateInfo)->Set();
   }

};

int main()
{
   Console::WriteLine( "Main starting." );
   AutoResetEvent^ autoEvent = gcnew AutoResetEvent( false );
   ThreadPool::QueueUserWorkItem( gcnew WaitCallback( &WaitOne::WorkMethod ), autoEvent );
   
   // Wait for work method to signal.
   if ( autoEvent->WaitOne( TimeSpan(0,0,1), false ) )
   {
      Console::WriteLine( "Work method signaled." );
   }
   else
   {
      Console::WriteLine( "Timed out waiting for work "
      "method to signal." );
   }

   Console::WriteLine( "Main ending." );
}

using System;
using System.Threading;

class WaitOne
{
    static AutoResetEvent autoEvent = new AutoResetEvent(false);

    static void Main()
    {
        Console.WriteLine("Main starting.");

        ThreadPool.QueueUserWorkItem(
            new WaitCallback(WorkMethod), autoEvent);

        // Wait for work method to signal.
        if(autoEvent.WaitOne(new TimeSpan(0, 0, 1), false))
        {
            Console.WriteLine("Work method signaled.");
        }
        else
        {
            Console.WriteLine("Timed out waiting for work " +
                "method to signal.");
        }
        Console.WriteLine("Main ending.");
    }

    static void WorkMethod(object stateInfo) 
    {
        Console.WriteLine("Work starting.");

        // Simulate time spent working.
        Thread.Sleep(new Random().Next(100, 2000));

        // Signal that work is finished.
        Console.WriteLine("Work ending.");
        ((AutoResetEvent)stateInfo).Set();
    }
}
Imports System.Threading

Public Class WaitOne

    Shared autoEvent As New AutoResetEvent(False)

    <MTAThread> _
    Shared Sub Main()
        Console.WriteLine("Main starting.")

        ThreadPool.QueueUserWorkItem(AddressOf WorkMethod, autoEvent)

        ' Wait for work method to signal.
        If autoEvent.WaitOne(New TimeSpan(0, 0, 1), False) Then
            Console.WriteLine("Work method signaled.")
        Else
            Console.WriteLine("Timed out waiting for work " & _
                "method to signal.")
        End If

        Console.WriteLine("Main ending.")
    End Sub

    Shared Sub WorkMethod(stateInfo As Object) 
        Console.WriteLine("Work starting.")

        ' Simulate time spent working.
        Thread.Sleep(New Random().Next(100, 2000))

        ' Signal that work is finished.
        Console.WriteLine("Work ending.")
        CType(stateInfo, AutoResetEvent).Set()
    End Sub

End Class

Açıklamalar

timeoutSıfırsa, yöntemi engellemez.If timeout is zero, the method does not block. Bekleme tutamacının durumunu sınar ve hemen döndürür.It tests the state of the wait handle and returns immediately.

AbandonedMutexException .NET Framework sürüm 2,0 ' de yenidir.AbandonedMutexException is new in the .NET Framework version 2.0. Önceki sürümlerde, WaitOne yöntemi true bir mutex terk edildiğinde döndürür.In previous versions, the WaitOne method returns true when a mutex is abandoned. Bırakılan mutex genellikle ciddi bir kodlama hatasını gösterir.An abandoned mutex often indicates a serious coding error. Sistem genelinde bir mutex söz konusu olduğunda, bir uygulamanın aniden sonlandırıldığı (örneğin, Windows Görev Yöneticisi 'ni kullanarak) göstergesi olabilir.In the case of a system-wide mutex, it might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager). Özel durum, hata ayıklama için yararlı bilgiler içerir.The exception contains information useful for debugging.

Bu yöntem, geçerli örnek bir sinyal alıncaya veya bir zaman aşımı gerçekleşene kadar engeller.The caller of this method blocks until the current instance receives a signal or a time-out occurs. WaitHandleZaman uyumsuz bir işlem tamamlandığında oluşturulduğu gibi başka bir iş parçacığından bir sinyal alana kadar engellemek için bu yöntemi kullanın.Use this method to block until a WaitHandle receives a signal from another thread, such as is generated when an asynchronous operation completes. Daha fazla bilgi için arabirimine bakın IAsyncResult .For more information, see the IAsyncResult interface.

Türetilmiş sınıfların davranışını özelleştirmek için bu yöntemi geçersiz kılın.Override this method to customize the behavior of derived classes.

İçin en büyük değer timeout Int32.MaxValue .The maximum value for timeout is Int32.MaxValue.

Bağlamdan Çıkmaya İlişkin NotlarNotes on Exiting the Context

exitContext WaitOne Yöntemi, varsayılan olarak yönetilen bir bağlamın içinden çağrılmamışsa parametrenin hiçbir etkisi yoktur.The exitContext parameter has no effect unless the WaitOne method is called from inside a nondefault managed context. Bu, İş parçacığınıza türetilmiş bir sınıfın örneğine yapılan bir çağrının içindeyse meydana gelebilir ContextBoundObject .This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Şu anda öğesinden türetilmeyen bir sınıf üzerinde bir yöntemi yürütseniz bile ContextBoundObject String , ContextBoundObject geçerli uygulama etki alanındaki yığınınızdan bir varsa, varsayılan dışı bir bağlamda olabilirsiniz.Even if you are currently executing a method on a class that does not derive from ContextBoundObject, like String, you can be in a nondefault context if a ContextBoundObject is on your stack in the current application domain.

Kodunuz, varsayılan olmayan bir bağlamda true yürütülmiyorsa, için belirtmek, exitContext iş parçacığının, yöntemi yürütmeden önce varsayılan olarak, varsayılan içeriğe geçiş yapmasına izin vermez WaitOne .When your code is executing in a nondefault context, specifying true for exitContext causes the thread to exit the nondefault managed context (that is, to transition to the default context) before executing the WaitOne method. İş parçacığı, yöntemi çağrısının tamamlanmasından sonra orijinal varsayılan olmayan içeriğe geri döner WaitOne .The thread returns to the original nondefault context after the call to the WaitOne method completes.

Bu, bağlam bağlantılı sınıf olduğunda yararlı olabilir SynchronizationAttribute .This can be useful when the context-bound class has SynchronizationAttribute. 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 için kodun tamamının gövdesidir.In that case, all calls to members of the class are automatically synchronized, and the synchronization domain is the entire body of code for the class. Bir üyenin Çağrı yığınındaki kod WaitOne yöntemini çağırır ve true için exitContext şunu belirtiyorsa, iş parçacığı eşitleme etki alanından çıkar ve nesnenin herhangi bir üyesine yönelik bir çağrıda engellenen bir iş parçacığının devam etmesini sağlar.If code in the call stack of a member calls the WaitOne method and specifies true for exitContext, the thread exits the synchronization domain, allowing a thread that is blocked on a call to any member of the object to proceed. WaitOneYöntem döndüğünde, çağrıyı yapan iş parçacığının eşitleme etki alanını yeniden girmesi gerekir.When the WaitOne method returns, the thread that made the call must wait to reenter the synchronization domain.

Şunlara uygulanır