WaitHandle.WaitOne Metoda

Definice

Blokuje aktuální vlákno, dokud proud WaitHandle neobdrží signál.

Přetížení

Name Description
WaitOne()

Blokuje aktuální vlákno, dokud proud WaitHandle neobdrží signál.

WaitOne(Int32)

Blokuje aktuální vlákno, dokud aktuální WaitHandle neobdrží signál, pomocí 32bitového znaménka integer určuje časový interval v milisekundách.

WaitOne(TimeSpan)

Blokuje aktuální vlákno, dokud aktuální instance neobdrží signál pomocí TimeSpan k určení časového intervalu.

WaitOne(Int32, Boolean)

Zablokuje aktuální vlákno, dokud aktuální WaitHandle neobdrží signál, pomocí 32bitového znaménka integer určí časový interval a určí, jestli se má před čekáním ukončit synchronizační doména.

WaitOne(TimeSpan, Boolean)

Zablokuje aktuální vlákno, dokud aktuální instance neobdrží signál, pomocí parametru TimeSpan a určí, zda se má před čekáním ukončit synchronizační doména.

WaitOne()

Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs

Blokuje aktuální vlákno, dokud proud WaitHandle neobdrží signál.

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

Návraty

true pokud aktuální instance obdrží signál. Pokud aktuální instance není nikdy signalována, WaitOne() nikdy se nevrátí.

Výjimky

Aktuální instance již byla uvolněna.

Čekání bylo dokončeno, protože vlákno se ukončilo bez uvolnění mutexu.

Aktuální instance je transparentní proxy server pro jinou WaitHandle doménu aplikace.

Příklady

Následující příklad kódu ukazuje, jak pomocí obslužného rutiny čekání udržet proces před ukončením, zatímco čeká na dokončení provádění vlákna na pozadí.

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

Poznámky

AbandonedMutexException je novinka v rozhraní .NET Framework verze 2.0. V předchozích verzích WaitOne vrátí true metoda při opuštění mutexu. Opuštěný mutex často značí závažnou chybu kódování. V případě mutexu celého systému může značit, že aplikace byla náhle ukončena (například pomocí Správce úloh systému Windows). Výjimka obsahuje informace užitečné pro ladění.

Volající této metody blokuje neomezeně dlouhou dobu, dokud aktuální instance neobdrží signál. Tuto metodu použijte k blokování, dokud WaitHandle neobdrží signál z jiného vlákna, například je generován při dokončení asynchronní operace. Další informace najdete v rozhraní IAsyncResult.

Volání tohoto přetížení metody je ekvivalentní volání WaitOne(Int32, Boolean) přetížení metody a určení -1 nebo Timeout.Infinite pro první parametr a false druhý parametr.

Přepsat tuto metodu přizpůsobit chování odvozených tříd.

Platí pro

WaitOne(Int32)

Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs

Blokuje aktuální vlákno, dokud aktuální WaitHandle neobdrží signál, pomocí 32bitového znaménka integer určuje časový interval v milisekundách.

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

Parametry

millisecondsTimeout
Int32

Počet milisekund, které se mají počkat, nebo Infinite (-1) čekat na neomezenou dobu.

Návraty

truepokud aktuální instance obdrží signál; v opačném případě . false

Výjimky

Aktuální instance již byla uvolněna.

millisecondsTimeout je záporné číslo jiné než -1, což představuje nekonečný časový limit.

Čekání bylo dokončeno, protože vlákno se ukončilo bez uvolnění mutexu.

Aktuální instance je transparentní proxy server pro jinou WaitHandle doménu aplikace.

Příklady

Následující příklad kódu ukazuje, jak pomocí obslužného rutiny čekání udržet proces před ukončením, zatímco čeká na dokončení provádění vlákna na pozadí.

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

Poznámky

Pokud millisecondsTimeout je nula, metoda neblokuje. Testuje stav popisovače čekání a vrátí okamžitě.

Volající této metody blokuje, dokud aktuální instance neobdrží signál nebo dojde k vypršení časového limitu. Tuto metodu použijte k blokování, dokud WaitHandle neobdrží signál z jiného vlákna, například je generován při dokončení asynchronní operace. Další informace najdete v rozhraní IAsyncResult.

Přepsat tuto metodu přizpůsobit chování odvozených tříd.

Volání této přetížení metody je stejné jako volání WaitOne(Int32, Boolean) přetížení a určení false pro exitContext.

Platí pro

WaitOne(TimeSpan)

Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs

Blokuje aktuální vlákno, dokud aktuální instance neobdrží signál pomocí TimeSpan k určení časového intervalu.

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

Parametry

timeout
TimeSpan

Jedná TimeSpan se o počet milisekund, které se mají čekat, nebo TimeSpan počet milisekund, které představují -1 milisekundy, které se mají čekat neomezeně dlouho.

Návraty

truepokud aktuální instance obdrží signál; v opačném případě . false

Výjimky

Aktuální instance již byla uvolněna.

timeout je záporné číslo jiné než -1 milisekund, což představuje nekonečný časový limit.

nebo

timeout je větší než Int32.MaxValue.

Čekání bylo dokončeno, protože vlákno se ukončilo bez uvolnění mutexu.

Aktuální instance je transparentní proxy server pro jinou WaitHandle doménu aplikace.

Poznámky

Pokud timeout je nula, metoda neblokuje. Testuje stav popisovače čekání a vrátí okamžitě.

Volající této metody blokuje, dokud aktuální instance neobdrží signál nebo dojde k vypršení časového limitu. Tuto metodu použijte k blokování, dokud WaitHandle neobdrží signál z jiného vlákna, například je generován při dokončení asynchronní operace. Další informace najdete v rozhraní IAsyncResult.

Přepsat tuto metodu přizpůsobit chování odvozených tříd.

Maximální hodnota pro timeout hodnotu je Int32.MaxValue.

Volání této přetížení metody je stejné jako volání WaitOne(TimeSpan, Boolean) přetížení a určení false pro exitContext.

Platí pro

WaitOne(Int32, Boolean)

Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs

Zablokuje aktuální vlákno, dokud aktuální WaitHandle neobdrží signál, pomocí 32bitového znaménka integer určí časový interval a určí, jestli se má před čekáním ukončit synchronizační doména.

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

Parametry

millisecondsTimeout
Int32

Počet milisekund, které se mají počkat, nebo Infinite (-1) čekat na neomezenou dobu.

exitContext
Boolean

trueukončit synchronizační doménu pro kontext před čekáním (pokud je v synchronizovaném kontextu) a potom ji znovu požádat; v opačném případě . false

Návraty

truepokud aktuální instance obdrží signál; v opačném případě . false

Výjimky

Aktuální instance již byla uvolněna.

millisecondsTimeout je záporné číslo jiné než -1, což představuje nekonečný časový limit.

Čekání bylo dokončeno, protože vlákno se ukončilo bez uvolnění mutexu.

Aktuální instance je transparentní proxy server pro jinou WaitHandle doménu aplikace.

Příklady

Následující příklad ukazuje, jak WaitOne(Int32, Boolean) se přetížení metody chová, když je volána v rámci synchronizační domény. Nejprve vlákno čeká s nastaveným exitContextfalse nastavením a bloky, dokud nevyprší časový limit čekání. Druhé vlákno se spustí po ukončení prvního vlákna a počká s nastaveným exitContext na true. Volání signalizovat popisovač čekání pro toto druhé vlákno není blokováno a vlákno se dokončí před vypršením časového limitu čekání.

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!!!

Poznámky

Pokud millisecondsTimeout je nula, metoda neblokuje. Testuje stav popisovače čekání a vrátí okamžitě.

Pokud je mutex opuštěný, AbandonedMutexException je vyvolán. Opuštěný mutex často značí závažnou chybu kódování. V případě mutexu celého systému může značit, že aplikace byla náhle ukončena (například pomocí Správce úloh systému Windows). Výjimka obsahuje informace užitečné pro ladění.

Volající této metody blokuje, dokud aktuální instance neobdrží signál nebo dojde k vypršení časového limitu. Tuto metodu použijte k blokování, dokud WaitHandle neobdrží signál z jiného vlákna, například je generován při dokončení asynchronní operace. Další informace najdete v rozhraní IAsyncResult.

Přepsat tuto metodu přizpůsobit chování odvozených tříd.

Ukončení kontextu

Parametr exitContext nemá žádný vliv, pokud tato metoda není volána z nedefault spravovaného kontextu. Spravovaný kontext může být nedefaultní, pokud je vlákno uvnitř volání instance třídy odvozené z ContextBoundObject. I když aktuálně spouštíte metodu ve třídě, která není odvozená od ContextBoundObject, například String, můžete být v nedefaultním kontextu, pokud ContextBoundObject je ve vašem zásobníku v aktuální doméně aplikace.

Když se váš kód spouští v nedefaultním kontextu, určuje true , že vlákno exitContext ukončí nedefaultní spravovaný kontext (to znamená přechod na výchozí kontext) před spuštěním této metody. Vlákno se vrátí do původního nedefault kontextu po dokončení volání této metody.

Ukončení kontextu může být užitečné, pokud má třída vázané na SynchronizationAttribute kontext atribut. V takovém případě jsou všechna volání členů třídy automaticky synchronizována a synchronizační doména je celý text kódu pro třídu. Pokud kód v zásobníku volání člen volá tuto metodu a určuje true pro exitContext, vlákno ukončí synchronizační doménu, což umožňuje vlákno blokované při volání libovolného člena objektu pokračovat. Když tato metoda vrátí, vlákno, které provedlo volání, musí počkat na opětovné zadání synchronizační domény.

Platí pro

WaitOne(TimeSpan, Boolean)

Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs

Zablokuje aktuální vlákno, dokud aktuální instance neobdrží signál, pomocí parametru TimeSpan a určí, zda se má před čekáním ukončit synchronizační doména.

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

Parametry

timeout
TimeSpan

Jedná TimeSpan se o počet milisekund, které se mají čekat, nebo TimeSpan počet milisekund, které představují -1 milisekundy, které se mají čekat neomezeně dlouho.

exitContext
Boolean

trueukončit synchronizační doménu pro kontext před čekáním (pokud je v synchronizovaném kontextu) a potom ji znovu požádat; v opačném případě . false

Návraty

truepokud aktuální instance obdrží signál; v opačném případě . false

Výjimky

Aktuální instance již byla uvolněna.

timeout je záporné číslo jiné než -1 milisekund, což představuje nekonečný časový limit.

nebo

timeout je větší než Int32.MaxValue.

Čekání bylo dokončeno, protože vlákno se ukončilo bez uvolnění mutexu.

Aktuální instance je transparentní proxy server pro jinou WaitHandle doménu aplikace.

Příklady

Následující příklad kódu ukazuje, jak pomocí obslužného rutiny čekání udržet proces před ukončením, zatímco čeká na dokončení provádění vlákna na pozadí.

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

Poznámky

Pokud timeout je nula, metoda neblokuje. Testuje stav popisovače čekání a vrátí okamžitě.

Pokud je mutex opuštěný, AbandonedMutexException je vyvolán. Opuštěný mutex často značí závažnou chybu kódování. V případě mutexu celého systému může značit, že aplikace byla náhle ukončena (například pomocí Správce úloh systému Windows). Výjimka obsahuje informace užitečné pro ladění.

Volající této metody blokuje, dokud aktuální instance neobdrží signál nebo dojde k vypršení časového limitu. Tuto metodu použijte k blokování, dokud WaitHandle neobdrží signál z jiného vlákna, například je generován při dokončení asynchronní operace. Další informace najdete v rozhraní IAsyncResult.

Přepsat tuto metodu přizpůsobit chování odvozených tříd.

Maximální hodnota pro timeout hodnotu je Int32.MaxValue.

Ukončení kontextu

Parametr exitContext nemá žádný vliv, pokud tato metoda není volána z nedefault spravovaného kontextu. Spravovaný kontext může být nedefaultní, pokud je vlákno uvnitř volání instance třídy odvozené z ContextBoundObject. I když aktuálně spouštíte metodu ve třídě, která není odvozená od ContextBoundObject, například String, můžete být v nedefaultním kontextu, pokud ContextBoundObject je ve vašem zásobníku v aktuální doméně aplikace.

Když se váš kód spouští v nedefaultním kontextu, určuje true , že vlákno exitContext ukončí nedefaultní spravovaný kontext (to znamená přechod na výchozí kontext) před spuštěním této metody. Vlákno se vrátí do původního nedefault kontextu po dokončení volání této metody.

Ukončení kontextu může být užitečné, pokud má třída vázané na SynchronizationAttribute kontext atribut. V takovém případě jsou všechna volání členů třídy automaticky synchronizována a synchronizační doména je celý text kódu pro třídu. Pokud kód v zásobníku volání člen volá tuto metodu a určuje true pro exitContext, vlákno ukončí synchronizační doménu, což umožňuje vlákno blokované při volání libovolného člena objektu pokračovat. Když tato metoda vrátí, vlákno, které provedlo volání, musí počkat na opětovné zadání synchronizační domény.

Platí pro