WaitHandle.WaitAny Yöntem

Tanım

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

Aşırı Yüklemeler

WaitAny(WaitHandle[])

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

WaitAny(WaitHandle[], Int32)

Zaman aralığını belirtmek için 32 bit imzalı bir tamsayı kullanarak belirtilen dizideki öğelerden herhangi birinin sinyal almasını bekler.

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[], Int32, Boolean)

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ı belirterek, belirtilen dizideki öğelerden herhangi birinin sinyal almasını bekler.

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ıp çıkılmayacağını belirtir.

WaitAny(WaitHandle[])

Kaynak:
WaitHandle.cs
Kaynak:
WaitHandle.cs
Kaynak:
WaitHandle.cs

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

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles);
public static int WaitAny (System.Threading.WaitHandle[] waitHandles);
static member WaitAny : System.Threading.WaitHandle[] -> int
Public Shared Function WaitAny (waitHandles As WaitHandle()) As Integer

Parametreler

waitHandles
WaitHandle[]

WaitHandle Geçerli örneğin bekleyeceği nesneleri içeren bir dizi.

Döndürülenler

Bekleme koşullarını karşılayan nesnenin dizi dizini.

Özel durumlar

waitHandles parametresidirnull.

-veya-

Dizideki waitHandles nesnelerden biri veya daha fazlası şeklindedir null.

içindeki waitHandles nesne sayısı, sistemin izin verdiklerinden daha fazla.

waitHandlesöğeleri olmayan bir dizidir ve .NET Framework sürümü 1.0 veya 1.1'dir.

Bir iş parçacığı bir mutex serbest bırakmadan çıktığı için bekleme tamamlandı.

waitHandlesöğeleri olmayan bir dizidir ve .NET Framework sürümü 2.0 veya üzeridir.

Dizi, waitHandles başka bir uygulama etki alanındaki için saydam bir WaitHandle ara sunucu içerir.

Örnekler

Aşağıdaki kod örneğinde yönteminin çağrılması gösterilmektedir WaitAny .

using namespace System;
using namespace System::Threading;

public ref class WaitHandleExample
{
    // Define a random number generator for testing.
private:
    static Random^ random = gcnew Random();
public:
    static void DoTask(Object^ state)
    {
        AutoResetEvent^ autoReset = (AutoResetEvent^) state;
        int time = 1000 * random->Next(2, 10);
        Console::WriteLine("Performing a task for {0} milliseconds.", time);
        Thread::Sleep(time);
        autoReset->Set();
    }
};

int main()
{
    // Define an array with two AutoResetEvent WaitHandles.
    array<WaitHandle^>^ handles = gcnew array<WaitHandle^> {
        gcnew AutoResetEvent(false), gcnew AutoResetEvent(false)};

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

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

// This code produces the following sample output.
//
// 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).
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

AbandonedMutexException.NET Framework sürüm 2.0'da yenidir. Önceki sürümlerde, WaitAny bir mutex bırakıldığından bekleme tamamlandığında yöntemi döndürülüyor true . Terk edilmiş bir mutex genellikle ciddi bir kodlama hatasına işaret eder. Sistem genelinde bir mutex söz konusu olduğunda, bir uygulamanın aniden sonlandırıldığını gösterebilir (örneğin, Windows Görev Yöneticisi kullanılarak). Özel durum, hata ayıklama için yararlı bilgiler içerir.

WaitAny yöntemi, yalnızca bekleme tamamlandığında terk edilmiş bir mutex nedeniyle bir oluştururAbandonedMutexException. waitHandles Terk edilen mutex'ten daha düşük dizin numarasına sahip serbest bırakılmış bir mutex içeriyorsa, WaitAny yöntem normal şekilde tamamlanır ve özel durum atılmaz.

Not

.NET Framework sürüm 2.0'dan önceki sürümlerinde, bir iş parçacığı açıkça serbest bırakmadan çıkar veya durdurulursa ve başka Mutex bir Mutexiş parçacığındaki bir WaitAny dizide dizin 0 (sıfır) olduğunda, tarafından WaitAny döndürülen dizin 0 yerine 128'dir.

Bu yöntem, herhangi bir tanıtıcı işaretlendiğinde döndürür. Çağrı sırasında birden fazla nesne sinyale dönüşürse, dönüş değeri, tüm sinyalli nesnelerin en küçük dizin değerine sahip sinyalli nesnenin dizi dizinidir.

Bekleme tutamaçlarının en fazla sayısı 64, geçerli iş parçacığı durumundaysa 63'tür STA .

Bu yöntem aşırı yüklemesinin çağrılması yöntemi aşırı yüklemesinin WaitAny(WaitHandle[], Int32, Boolean) çağrılmasıyla ve için millisecondsTimeouttrue -1 (veya Timeout.Infinite) belirtilmesiyle exitContexteşdeğerdir.

Şunlara uygulanır

WaitAny(WaitHandle[], Int32)

Kaynak:
WaitHandle.cs
Kaynak:
WaitHandle.cs
Kaynak:
WaitHandle.cs

Zaman aralığını belirtmek için 32 bit imzalı bir tamsayı kullanarak belirtilen dizideki öğelerden herhangi birinin sinyal almasını bekler.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, int millisecondsTimeout);
public static int WaitAny (System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout);
static member WaitAny : System.Threading.WaitHandle[] * int -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), millisecondsTimeout As Integer) As Integer

Parametreler

waitHandles
WaitHandle[]

WaitHandle Geçerli örneğin bekleyeceği nesneleri içeren bir dizi.

millisecondsTimeout
Int32

Beklenen milisaniye sayısı veya Infinite (-1) süresiz olarak bekleniyor.

Döndürülenler

Beklemeyi karşılayan nesnenin dizi dizini veya WaitTimeout beklemeyi karşılayan bir nesne yoksa ve eşdeğer millisecondsTimeout bir zaman aralığı geçirildi.

Özel durumlar

waitHandles parametresidirnull.

-veya-

Dizideki waitHandles nesnelerden biri veya daha fazlası şeklindedir null.

içindeki waitHandles nesne sayısı, sistemin izin verdiklerinden daha fazla.

millisecondsTimeout , -1 dışında, sonsuz bir zaman aşımını temsil eden negatif bir sayıdır.

Bir iş parçacığı bir mutex serbest bırakmadan çıktığı için bekleme tamamlandı.

waitHandles öğe içermeyen bir dizidir.

Dizi, waitHandles başka bir uygulama etki alanındaki için saydam bir WaitHandle ara sunucu içerir.

Açıklamalar

Sıfır ise millisecondsTimeout , yöntemi engellemez. Bekleme tutamaçlarının durumunu test eder ve hemen döndürür.

WaitAny yöntemi, yalnızca bekleme tamamlandığında terk edilmiş bir mutex nedeniyle bir oluştururAbandonedMutexException. waitHandles Terk edilen mutex'ten daha düşük dizin numarasına sahip serbest bırakılmış bir mutex içeriyorsa, WaitAny yöntem normal şekilde tamamlanır ve özel durum atılmaz.

Bu yöntem, tanıtıcılardan herhangi birine sinyal verildiğinde veya zaman aşımı oluştuğunda bekleme sona erdiğinde döndürür. Çağrı sırasında birden fazla nesne sinyale dönüşürse, dönüş değeri, tüm sinyalli nesnelerin en küçük dizin değerine sahip sinyalli nesnenin dizi dizinidir.

Bekleme tutamaçlarının en fazla sayısı 64, geçerli iş parçacığı durumundaysa 63'tür STA .

Bu yöntem aşırı yüklemesini çağırmak, aşırı yüklemeyi çağırmak WaitAny(WaitHandle[], Int32, Boolean) ve için belirtmekle falseexitContextaynıdır.

Şunlara uygulanır

WaitAny(WaitHandle[], TimeSpan)

Kaynak:
WaitHandle.cs
Kaynak:
WaitHandle.cs
Kaynak:
WaitHandle.cs

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

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, TimeSpan timeout);
public static int WaitAny (System.Threading.WaitHandle[] waitHandles, TimeSpan timeout);
static member WaitAny : System.Threading.WaitHandle[] * TimeSpan -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), timeout As TimeSpan) As Integer

Parametreler

waitHandles
WaitHandle[]

WaitHandle Geçerli örneğin bekleyeceği nesneleri içeren bir dizi.

timeout
TimeSpan

TimeSpan Bekleyebilecek milisaniye sayısını temsil eden veya süresiz olarak bekleyebilecek -1 milisaniyeyi temsil eden birTimeSpan.

Döndürülenler

Beklemeyi karşılayan nesnenin dizi dizini veya WaitTimeout beklemeyi karşılayan bir nesne yoksa ve eşdeğer timeout bir zaman aralığı geçirildi.

Özel durumlar

waitHandles parametresidirnull.

-veya-

Dizideki waitHandles nesnelerden biri veya daha fazlası şeklindedir null.

içindeki waitHandles nesne sayısı, sistemin izin verdiklerinden daha fazla.

timeout , -1 milisaniye dışında, sonsuz bir zaman aşımını temsil eden negatif bir sayıdır.

-veya-

timeout Int32.MaxValue değerinden büyüktür.

Bir iş parçacığı bir mutex serbest bırakmadan çıktığı için bekleme tamamlandı.

waitHandles öğe içermeyen bir dizidir.

Dizi, waitHandles başka bir uygulama etki alanındaki için saydam bir WaitHandle ara sunucu içerir.

Açıklamalar

Sıfır ise timeout , yöntemi engellemez. Bekleme tutamaçlarının durumunu test eder ve hemen döndürür.

WaitAny yöntemi, yalnızca bekleme tamamlandığında terk edilmiş bir mutex nedeniyle bir oluştururAbandonedMutexException. waitHandles Terk edilen mutex'ten daha düşük dizin numarasına sahip serbest bırakılmış bir mutex içeriyorsa, WaitAny yöntem normal şekilde tamamlanır ve özel durum atılmaz.

Bu yöntem, tanıtıcılardan herhangi birine sinyal verildiğinde veya zaman aşımı oluştuğunda bekleme sona erdiğinde döndürür. Çağrı sırasında birden fazla nesne sinyale dönüşürse, dönüş değeri, tüm sinyalli nesnelerin en küçük dizin değerine sahip sinyalli nesnenin dizi dizinidir.

Bekleme tutamaçlarının en fazla sayısı 64, geçerli iş parçacığı durumundaysa 63'tür STA .

için timeout en büyük değer değeridir Int32.MaxValue.

Bu yöntem aşırı yüklemesini çağırmak, aşırı yüklemeyi çağırmak WaitAny(WaitHandle[], TimeSpan, Boolean) ve için belirtmekle falseexitContextaynıdır.

Şunlara uygulanır

WaitAny(WaitHandle[], Int32, Boolean)

Kaynak:
WaitHandle.cs
Kaynak:
WaitHandle.cs
Kaynak:
WaitHandle.cs

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ı belirterek, belirtilen dizideki öğelerden herhangi birinin sinyal almasını bekler.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, int millisecondsTimeout, bool exitContext);
public static int WaitAny (System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext);
static member WaitAny : System.Threading.WaitHandle[] * int * bool -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), millisecondsTimeout As Integer, exitContext As Boolean) As Integer

Parametreler

waitHandles
WaitHandle[]

WaitHandle Geçerli örneğin bekleyeceği nesneleri içeren bir dizi.

millisecondsTimeout
Int32

Beklenen milisaniye sayısı veya Infinite (-1) süresiz olarak bekleniyor.

exitContext
Boolean

true beklemeden önce bağlam için eşitleme etki alanından çıkmak (eşitlenmiş bir bağlamdaysa) ve daha sonra yeniden almak; aksi takdirde , false.

Döndürülenler

Beklemeyi karşılayan nesnenin dizi dizini veya WaitTimeout beklemeyi karşılayan bir nesne yoksa ve eşdeğer millisecondsTimeout bir zaman aralığı geçirildi.

Özel durumlar

waitHandles parametresidirnull.

-veya-

Dizideki waitHandles nesnelerden biri veya daha fazlası şeklindedir null.

içindeki waitHandles nesne sayısı, sistemin izin verdiklerinden daha fazla.

waitHandlesöğeleri olmayan bir dizidir ve .NET Framework sürümü 1.0 veya 1.1'dir.

millisecondsTimeout , -1 dışında, sonsuz bir zaman aşımını temsil eden negatif bir sayıdır.

Bir iş parçacığı bir mutex serbest bırakmadan çıktığı için bekleme tamamlandı.

waitHandlesöğeleri olmayan bir dizidir ve .NET Framework sürümü 2.0 veya üzeridir.

Dizi, waitHandles başka bir uygulama etki alanındaki için saydam bir WaitHandle ara sunucu içerir.

Örnekler

Aşağıdaki kod örneği, birden çok diskte bir dosyayı aynı anda aramak için iş parçacığı havuzunun nasıl kullanılacağını gösterir. Alanda dikkat edilmesi gereken noktalar için her diskin yalnızca kök dizininde arama yapılır.

using namespace System;
using namespace System::IO;
using namespace System::Threading;
ref class Search
{
private:

   // Maintain state information to pass to FindCallback.
   ref class State
   {
   public:
      AutoResetEvent^ autoEvent;
      String^ fileName;
      State( AutoResetEvent^ autoEvent, String^ fileName )
         : autoEvent( autoEvent ), fileName( fileName )
      {}

   };


public:
   array<AutoResetEvent^>^autoEvents;
   array<String^>^diskLetters;

   // Search for stateInfo->fileName.
   void FindCallback( Object^ state )
   {
      State^ stateInfo = dynamic_cast<State^>(state);
      
      // Signal if the file is found.
      if ( File::Exists( stateInfo->fileName ) )
      {
         stateInfo->autoEvent->Set();
      }
   }

   Search()
   {
      
      // Retrieve an array of disk letters.
      diskLetters = Environment::GetLogicalDrives();
      autoEvents = gcnew array<AutoResetEvent^>(diskLetters->Length);
      for ( int i = 0; i < diskLetters->Length; i++ )
      {
         autoEvents[ i ] = gcnew AutoResetEvent( false );

      }
   }


   // Search for fileName in the root directory of all disks.
   void FindFile( String^ fileName )
   {
      for ( int i = 0; i < diskLetters->Length; i++ )
      {
         Console::WriteLine(  "Searching for {0} on {1}.", fileName, diskLetters[ i ] );
         ThreadPool::QueueUserWorkItem( gcnew WaitCallback( this, &Search::FindCallback ), gcnew State( autoEvents[ i ],String::Concat( diskLetters[ i ], fileName ) ) );

      }
      
      // Wait for the first instance of the file to be found.
      int index = WaitHandle::WaitAny( autoEvents, 3000, false );
      if ( index == WaitHandle::WaitTimeout )
      {
         Console::WriteLine( "\n{0} not found.", fileName );
      }
      else
      {
         Console::WriteLine( "\n{0} found on {1}.", fileName, diskLetters[ index ] );
      }
   }

};

int main()
{
   Search^ search = gcnew Search;
   search->FindFile( "SomeFile.dat" );
}
using System;
using System.IO;
using System.Threading;

class Test
{
    static void Main()
    {
        Search search = new Search();
        search.FindFile("SomeFile.dat");
    }
}

class Search
{
    // Maintain state information to pass to FindCallback.
    class State
    {
        public AutoResetEvent autoEvent;
        public string         fileName;

        public State(AutoResetEvent autoEvent, string fileName)
        {
            this.autoEvent    = autoEvent;
            this.fileName     = fileName;
        }
    }

    AutoResetEvent[] autoEvents;
    String[] diskLetters;

    public Search()
    {
        // Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives();

        autoEvents = new AutoResetEvent[diskLetters.Length];
        for(int i = 0; i < diskLetters.Length; i++)
        {
            autoEvents[i] = new AutoResetEvent(false);
        }
    }

    // Search for fileName in the root directory of all disks.
    public void FindFile(string fileName)
    {
        for(int i = 0; i < diskLetters.Length; i++)
        {
            Console.WriteLine("Searching for {0} on {1}.",
                fileName, diskLetters[i]);
            ThreadPool.QueueUserWorkItem(
                new WaitCallback(FindCallback), 
                new State(autoEvents[i], diskLetters[i] + fileName));
        }

        // Wait for the first instance of the file to be found.
        int index = WaitHandle.WaitAny(autoEvents, 3000, false);
        if(index == WaitHandle.WaitTimeout)
        {
            Console.WriteLine("\n{0} not found.", fileName);
        }
        else
        {
            Console.WriteLine("\n{0} found on {1}.", fileName,
                diskLetters[index]);
        }
    }

    // Search for stateInfo.fileName.
    void FindCallback(object state)
    {
        State stateInfo = (State)state;

        // Signal if the file is found.
        if(File.Exists(stateInfo.fileName))
        {
            stateInfo.autoEvent.Set();
        }
    }
}
Imports System.IO
Imports System.Threading

Public Class Test

    <MTAThread> _
    Shared Sub Main()
        Dim search As New Search()
        search.FindFile("SomeFile.dat")
    End Sub    
End Class

Public Class Search

    ' Maintain state information to pass to FindCallback.
    Class State
        Public autoEvent As AutoResetEvent 
        Public fileName As String         

        Sub New(anEvent As AutoResetEvent, fName As String)
            autoEvent = anEvent
            fileName = fName
        End Sub
    End Class

    Dim autoEvents() As AutoResetEvent
    Dim diskLetters() As String

    Sub New()

        ' Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives()

        autoEvents = New AutoResetEvent(diskLetters.Length - 1) {}
        For i As Integer = 0 To diskLetters.Length - 1
            autoEvents(i) = New AutoResetEvent(False)
        Next i
    End Sub    
    
    ' Search for fileName in the root directory of all disks.
    Sub FindFile(fileName As String)
        For i As Integer = 0 To diskLetters.Length - 1
            Console.WriteLine("Searching for {0} on {1}.", _
                fileName, diskLetters(i))
        
            ThreadPool.QueueUserWorkItem(AddressOf FindCallback, _ 
                New State(autoEvents(i), diskLetters(i) & fileName))
        Next i

        ' Wait for the first instance of the file to be found.
        Dim index As Integer = _
            WaitHandle.WaitAny(autoEvents, 3000, False)
        If index = WaitHandle.WaitTimeout
            Console.WriteLine(vbCrLf & "{0} not found.", fileName)
        Else
            Console.WriteLine(vbCrLf & "{0} found on {1}.", _
                fileName, diskLetters(index))
        End If
    End Sub

    ' Search for stateInfo.fileName.
    Sub FindCallback(state As Object)
        Dim stateInfo As State = DirectCast(state, State)

        ' Signal if the file is found.
        If File.Exists(stateInfo.fileName) Then
            stateInfo.autoEvent.Set()
        End If
    End Sub

End Class

Açıklamalar

Sıfır ise millisecondsTimeout , yöntemi engellemez. Bekleme tutamaçlarının durumunu test eder ve hemen döndürür.

WaitAny yöntemi, yalnızca bekleme tamamlandığında terk edilmiş bir mutex nedeniyle bir oluştururAbandonedMutexException. waitHandles Terk edilen mutex'ten daha düşük dizin numarasına sahip serbest bırakılmış bir mutex içeriyorsa, WaitAny yöntem normal şekilde tamamlanır ve özel durum atılmaz. Terk edilmiş bir mutex genellikle ciddi bir kodlama hatasına işaret eder. Sistem genelinde bir mutex söz konusu olduğunda, bir uygulamanın aniden sonlandırıldığını gösterebilir (örneğin, Windows Görev Yöneticisi kullanılarak). Özel durum, hata ayıklama için yararlı bilgiler içerir.

Bu yöntem, tanıtıcılardan herhangi birine sinyal verildiğinde veya zaman aşımı oluştuğunda bekleme sona erdiğinde döndürür. Çağrı sırasında birden fazla nesne sinyale dönüşürse, dönüş değeri, tüm sinyalli nesnelerin en küçük dizin değerine sahip sinyalli nesnenin dizi dizinidir.

Bekleme tutamaçlarının en fazla sayısı 64, geçerli iş parçacığı durumundaysa 63'tür STA .

Bağlamdan çıkma

Bu exitContext yöntem, bilinmeyen yönetilen bağlamın içinden çağrılmadığı sürece parametresinin hiçbir etkisi olmaz. İş parçacığınız öğesinden ContextBoundObjecttüretilen bir sınıfın örneğine yönelik bir çağrının içindeyse yönetilen bağlamda hiçbir zaman uyumsuz olabilir. şu anda gibi Stringöğesinden ContextBoundObjecttüretilmiş olmayan 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, varsayılan olmayan bir bağlamda olabilirsiniz.

Kodunuz bilinmeyen bir bağlamda yürütülürken öğesinin belirtilmesi trueexitContext , iş parçacığının bu yöntemi yürütmeden önce bilinmeyen yönetilen bağlamdan (varsayılan bağlama geçiş için) çıkmasını sağlar. İş parçacığı, bu yöntem çağrısı tamamlandıktan sonra özgün bilinmeyen bağlama döner.

Bağlama bağlı sınıf özniteliğine sahip olduğunda bağlamdan SynchronizationAttribute çıkmak 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 bu yöntemi çağırır ve öğesini exitContextbelirtirsetrue, iş parçacığı eşitleme etki alanından çıkar ve bu da nesnenin herhangi bir üyesine yapılan çağrıda engellenen bir iş parçacığının devam etmesini sağlar. Bu yöntem döndürdüğünde, çağrıyı yapan iş parçacığının eşitleme etki alanını yeniden eklemek için beklemesi gerekir.

Şunlara uygulanır

WaitAny(WaitHandle[], TimeSpan, Boolean)

Kaynak:
WaitHandle.cs
Kaynak:
WaitHandle.cs
Kaynak:
WaitHandle.cs

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ıp çıkılmayacağını belirtir.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, TimeSpan timeout, bool exitContext);
public static int WaitAny (System.Threading.WaitHandle[] waitHandles, TimeSpan timeout, bool exitContext);
static member WaitAny : System.Threading.WaitHandle[] * TimeSpan * bool -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), timeout As TimeSpan, exitContext As Boolean) As Integer

Parametreler

waitHandles
WaitHandle[]

WaitHandle Geçerli örneğin bekleyeceği nesneleri içeren bir dizi.

timeout
TimeSpan

TimeSpan Bekleyebilecek milisaniye sayısını temsil eden veya süresiz olarak bekleyebilecek -1 milisaniyeyi temsil eden birTimeSpan.

exitContext
Boolean

true beklemeden önce bağlam için eşitleme etki alanından çıkmak (eşitlenmiş bir bağlamdaysa) ve daha sonra yeniden almak; aksi takdirde , false.

Döndürülenler

Beklemeyi karşılayan nesnenin dizi dizini veya WaitTimeout beklemeyi karşılayan bir nesne yoksa ve eşdeğer timeout bir zaman aralığı geçirildi.

Özel durumlar

waitHandles parametresidirnull.

-veya-

Dizideki waitHandles nesnelerden biri veya daha fazlası şeklindedir null.

içindeki waitHandles nesne sayısı, sistemin izin verdiklerinden daha fazla.

waitHandlesöğeleri olmayan bir dizidir ve .NET Framework sürümü 1.0 veya 1.1'dir.

timeout , -1 milisaniye dışında, sonsuz bir zaman aşımını temsil eden negatif bir sayıdır.

-veya-

timeout Int32.MaxValue değerinden büyüktür.

Bir iş parçacığı bir mutex serbest bırakmadan çıktığı için bekleme tamamlandı.

waitHandlesöğeleri olmayan bir dizidir ve .NET Framework sürümü 2.0 veya üzeridir.

Dizi, waitHandles başka bir uygulama etki alanındaki için saydam bir WaitHandle ara sunucu içerir.

Örnekler

Aşağıdaki kod örneği, birden çok diskte bir dosyayı aynı anda aramak için iş parçacığı havuzunun nasıl kullanılacağını gösterir. Alanda dikkat edilmesi gereken noktalar için her diskin yalnızca kök dizininde arama yapılır.

using namespace System;
using namespace System::IO;
using namespace System::Threading;
ref class Search
{
private:

   // Maintain state information to pass to FindCallback.
   ref class State
   {
   public:
      AutoResetEvent^ autoEvent;
      String^ fileName;
      State( AutoResetEvent^ autoEvent, String^ fileName )
         : autoEvent( autoEvent ), fileName( fileName )
      {}

   };


public:
   array<AutoResetEvent^>^autoEvents;
   array<String^>^diskLetters;

   // Search for stateInfo->fileName.
   void FindCallback( Object^ state )
   {
      State^ stateInfo = dynamic_cast<State^>(state);
      
      // Signal if the file is found.
      if ( File::Exists( stateInfo->fileName ) )
      {
         stateInfo->autoEvent->Set();
      }
   }

   Search()
   {
      
      // Retrieve an array of disk letters.
      diskLetters = Environment::GetLogicalDrives();
      autoEvents = gcnew array<AutoResetEvent^>(diskLetters->Length);
      for ( int i = 0; i < diskLetters->Length; i++ )
      {
         autoEvents[ i ] = gcnew AutoResetEvent( false );

      }
   }


   // Search for fileName in the root directory of all disks.
   void FindFile( String^ fileName )
   {
      for ( int i = 0; i < diskLetters->Length; i++ )
      {
         Console::WriteLine(  "Searching for {0} on {1}.", fileName, diskLetters[ i ] );
         ThreadPool::QueueUserWorkItem( gcnew WaitCallback( this, &Search::FindCallback ), gcnew State( autoEvents[ i ],String::Concat( diskLetters[ i ], fileName ) ) );

      }
      
      // Wait for the first instance of the file to be found.
      int index = WaitHandle::WaitAny( autoEvents, TimeSpan(0,0,3), false );
      if ( index == WaitHandle::WaitTimeout )
      {
         Console::WriteLine( "\n{0} not found.", fileName );
      }
      else
      {
         Console::WriteLine( "\n{0} found on {1}.", fileName, diskLetters[ index ] );
      }
   }

};

int main()
{
   Search^ search = gcnew Search;
   search->FindFile( "SomeFile.dat" );
}
using System;
using System.IO;
using System.Threading;

class Test
{
    static void Main()
    {
        Search search = new Search();
        search.FindFile("SomeFile.dat");
    }
}

class Search
{
    // Maintain state information to pass to FindCallback.
    class State
    {
        public AutoResetEvent autoEvent;
        public string         fileName;

        public State(AutoResetEvent autoEvent, string fileName)
        {
            this.autoEvent    = autoEvent;
            this.fileName     = fileName;
        }
    }

    AutoResetEvent[] autoEvents;
    String[] diskLetters;

    public Search()
    {
        // Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives();

        autoEvents = new AutoResetEvent[diskLetters.Length];
        for(int i = 0; i < diskLetters.Length; i++)
        {
            autoEvents[i] = new AutoResetEvent(false);
        }
    }

    // Search for fileName in the root directory of all disks.
    public void FindFile(string fileName)
    {
        for(int i = 0; i < diskLetters.Length; i++)
        {
            Console.WriteLine("Searching for {0} on {1}.",
                fileName, diskLetters[i]);
            ThreadPool.QueueUserWorkItem(
                new WaitCallback(FindCallback), 
                new State(autoEvents[i], diskLetters[i] + fileName));
        }

        // Wait for the first instance of the file to be found.
        int index = WaitHandle.WaitAny(
            autoEvents, new TimeSpan(0, 0, 3), false);
        if(index == WaitHandle.WaitTimeout)
        {
            Console.WriteLine("\n{0} not found.", fileName);
        }
        else
        {
            Console.WriteLine("\n{0} found on {1}.", fileName,
                diskLetters[index]);
        }
    }

    // Search for stateInfo.fileName.
    void FindCallback(object state)
    {
        State stateInfo = (State)state;

        // Signal if the file is found.
        if(File.Exists(stateInfo.fileName))
        {
            stateInfo.autoEvent.Set();
        }
    }
}
Imports System.IO
Imports System.Threading

Public Class Test

    <MTAThread> _
    Shared Sub Main()
        Dim search As New Search()
        search.FindFile("SomeFile.dat")
    End Sub    
End Class

Public Class Search

    ' Maintain state information to pass to FindCallback.
    Class State
        Public autoEvent As AutoResetEvent 
        Public fileName As String         

        Sub New(anEvent As AutoResetEvent, fName As String)
            autoEvent = anEvent
            fileName = fName
        End Sub
    End Class

    Dim autoEvents() As AutoResetEvent
    Dim diskLetters() As String

    Sub New()

        ' Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives()

        autoEvents = New AutoResetEvent(diskLetters.Length - 1) {}
        For i As Integer = 0 To diskLetters.Length - 1
            autoEvents(i) = New AutoResetEvent(False)
        Next i
    End Sub    
    
    ' Search for fileName in the root directory of all disks.
    Sub FindFile(fileName As String)
        For i As Integer = 0 To diskLetters.Length - 1
            Console.WriteLine("Searching for {0} on {1}.", _
                fileName, diskLetters(i))
        
            ThreadPool.QueueUserWorkItem(AddressOf FindCallback, _ 
                New State(autoEvents(i), diskLetters(i) & fileName))
        Next i

        ' Wait for the first instance of the file to be found.
        Dim index As Integer = WaitHandle.WaitAny( _
            autoEvents, New TimeSpan(0, 0, 3), False)
        If index = WaitHandle.WaitTimeout
            Console.WriteLine(vbCrLf & "{0} not found.", fileName)
        Else
            Console.WriteLine(vbCrLf & "{0} found on {1}.", _
                fileName, diskLetters(index))
        End If
    End Sub

    ' Search for stateInfo.fileName.
    Sub FindCallback(state As Object)
        Dim stateInfo As State = DirectCast(state, State)

        ' Signal if the file is found.
        If File.Exists(stateInfo.fileName) Then
            stateInfo.autoEvent.Set()
        End If
    End Sub

End Class

Açıklamalar

Sıfır ise timeout , yöntemi engellemez. Bekleme tutamaçlarının durumunu test eder ve hemen döndürür.

WaitAny yöntemi, yalnızca bekleme tamamlandığında terk edilmiş bir mutex nedeniyle bir oluştururAbandonedMutexException. waitHandles Terk edilen mutex'ten daha düşük dizin numarasına sahip serbest bırakılmış bir mutex içeriyorsa, WaitAny yöntem normal şekilde tamamlanır ve özel durum atılmaz. Terk edilmiş bir mutex genellikle ciddi bir kodlama hatasına işaret eder. Sistem genelinde bir mutex söz konusu olduğunda, bir uygulamanın aniden sonlandırıldığını gösterebilir (örneğin, Windows Görev Yöneticisi kullanılarak). Özel durum, hata ayıklama için yararlı bilgiler içerir.

Bu yöntem, tanıtıcılardan herhangi birine sinyal verildiğinde veya zaman aşımı oluştuğunda bekleme sona erdiğinde döndürür. Çağrı sırasında birden fazla nesne sinyale dönüşürse, dönüş değeri, tüm sinyalli nesnelerin en küçük dizin değerine sahip sinyalli nesnenin dizi dizinidir.

Bekleme tutamaçlarının en fazla sayısı 64, geçerli iş parçacığı durumundaysa 63'tür STA .

için timeout en büyük değer değeridir Int32.MaxValue.

Bağlamdan çıkma

Bu exitContext yöntem, bilinmeyen yönetilen bağlamın içinden çağrılmadığı sürece parametresinin hiçbir etkisi olmaz. İş parçacığınız öğesinden ContextBoundObjecttüretilen bir sınıfın örneğine yönelik bir çağrının içindeyse yönetilen bağlamda hiçbir zaman uyumsuz olabilir. şu anda gibi Stringöğesinden ContextBoundObjecttüretilmiş olmayan 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, varsayılan olmayan bir bağlamda olabilirsiniz.

Kodunuz bilinmeyen bir bağlamda yürütülürken öğesinin belirtilmesi trueexitContext , iş parçacığının bu yöntemi yürütmeden önce bilinmeyen yönetilen bağlamdan (varsayılan bağlama geçiş için) çıkmasını sağlar. İş parçacığı, bu yöntem çağrısı tamamlandıktan sonra özgün bilinmeyen bağlama döner.

Bağlama bağlı sınıf özniteliğine sahip olduğunda bağlamdan SynchronizationAttribute çıkmak 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 bu yöntemi çağırır ve öğesini exitContextbelirtirsetrue, iş parçacığı eşitleme etki alanından çıkar ve bu da nesnenin herhangi bir üyesine yapılan çağrıda engellenen bir iş parçacığının devam etmesini sağlar. Bu yöntem döndürdüğünde, çağrıyı yapan iş parçacığının eşitleme etki alanını yeniden eklemek için beklemesi gerekir.

Şunlara uygulanır