WaitHandle.WaitOne Metódus

Definíció

Blokkolja az aktuális szálat, amíg az áram WaitHandle nem kap jelet.

Túlterhelések

Name Description
WaitOne()

Blokkolja az aktuális szálat, amíg az áram WaitHandle nem kap jelet.

WaitOne(Int32)

Blokkolja az aktuális szálat, amíg az aktuális WaitHandle nem kap jelet, egy 32 bites aláírt egész számmal adja meg az időintervallumot ezredmásodpercben.

WaitOne(TimeSpan)

Letiltja az aktuális szálat, amíg az aktuális példány nem kap jelet az TimeSpan időintervallum megadásához.

WaitOne(Int32, Boolean)

Blokkolja az aktuális szálat, amíg az aktuális WaitHandle nem kap jelet, egy 32 bites aláírt egész számmal adja meg az időintervallumot, és adja meg, hogy a várakozás előtt ki kell-e lépnie a szinkronizálási tartományból.

WaitOne(TimeSpan, Boolean)

Letiltja az aktuális szálat, amíg az aktuális példány nem kap jelet, az időintervallum megadásához és annak megadásához, TimeSpan hogy a várakozás előtt kilépjen-e a szinkronizálási tartományból.

WaitOne()

Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs

Blokkolja az aktuális szálat, amíg az áram WaitHandle nem kap jelet.

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

Válaszok

true ha az aktuális példány jelet kap. Ha az aktuális példány soha nem lesz jelezve, WaitOne() soha nem tér vissza.

Kivételek

Az aktuális példány már el lett adva.

A várakozás befejeződött, mert egy szál a mutex feloldása nélkül lépett ki.

Az aktuális példány egy transzparens proxy egy WaitHandle másik alkalmazástartományban.

Példák

Az alábbi példakód bemutatja, hogyan lehet várakozási fogópontot használni, hogy a folyamat ne fejeződjön be, amíg egy háttérszál befejeződik.

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

Megjegyzések

AbandonedMutexException a .NET Framework 2.0-s verziójában új. A korábbi verziókban a WaitOne metódus a mutex elhagyásakor ad vissza true . Az elhagyott mutex gyakran komoly kódolási hibát jelez. Rendszerszintű mutex esetén azt jelezheti, hogy egy alkalmazás hirtelen leállt (például Windows Task Manager használatával). A kivétel a hibakereséshez hasznos információkat tartalmaz.

A metódus hívója határozatlan ideig blokkolja, amíg az aktuális példány nem kap jelet. Ezzel a módszerrel blokkolhatja, amíg egy WaitHandle másik száltól nem kap jelet, például amikor egy aszinkron művelet befejeződik. További információ: IAsyncResult felület.

A metódus túlterhelésének meghívása egyenértékű a metódus túlterhelésének meghívásával, valamint a WaitOne(Int32, Boolean) -1 vagy Timeout.Infinite az első paraméter és false a második paraméter megadásával.

A metódus felülbírálása a származtatott osztályok viselkedésének testreszabásához.

A következőre érvényes:

WaitOne(Int32)

Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs

Blokkolja az aktuális szálat, amíg az aktuális WaitHandle nem kap jelet, egy 32 bites aláírt egész számmal adja meg az időintervallumot ezredmásodpercben.

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

Paraméterek

millisecondsTimeout
Int32

A várakozni kívánt ezredmásodpercek száma, vagy Infinite (-1) a határozatlan ideig történő várakozáshoz.

Válaszok

trueha az aktuális példány jelet kap; egyéb esetben. false

Kivételek

Az aktuális példány már el lett adva.

millisecondsTimeout a negatív szám nem -1, ami végtelen időtúllépést jelöl.

A várakozás befejeződött, mert egy szál a mutex feloldása nélkül lépett ki.

Az aktuális példány egy transzparens proxy egy WaitHandle másik alkalmazástartományban.

Példák

Az alábbi példakód bemutatja, hogyan lehet várakozási fogópontot használni, hogy a folyamat ne fejeződjön be, amíg egy háttérszál befejeződik.

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

Megjegyzések

Ha millisecondsTimeout nulla, a metódus nem blokkolja a elemet. Teszteli a várakozási fogópont állapotát, és azonnal visszatér.

A metódus hívója addig blokkolja a hívót, amíg az aktuális példány nem kap jelet, vagy időtúllépés történik. Ezzel a módszerrel blokkolhatja, amíg egy WaitHandle másik száltól nem kap jelet, például amikor egy aszinkron művelet befejeződik. További információ: IAsyncResult felület.

A metódus felülbírálása a származtatott osztályok viselkedésének testreszabásához.

A metódus túlterhelésének meghívása ugyanaz, mint a WaitOne(Int32, Boolean) túlterhelés meghívása falseexitContext és a túlterhelés megadása.

A következőre érvényes:

WaitOne(TimeSpan)

Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs

Letiltja az aktuális szálat, amíg az aktuális példány nem kap jelet az TimeSpan időintervallum megadásához.

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

Paraméterek

timeout
TimeSpan

Ez TimeSpan a várakozási idő ezredmásodperc, vagy egy TimeSpan olyan érték, amely -1 ezredmásodpercet jelöl a határozatlan ideig történő várakozáshoz.

Válaszok

trueha az aktuális példány jelet kap; egyéb esetben. false

Kivételek

Az aktuális példány már el lett adva.

timeout a -1 ezredmásodpercen kívüli negatív szám, amely végtelen időtúllépést jelöl.

-vagy-

timeout nagyobb, mint az Int32.MaxValue.

A várakozás befejeződött, mert egy szál a mutex feloldása nélkül lépett ki.

Az aktuális példány egy transzparens proxy egy WaitHandle másik alkalmazástartományban.

Megjegyzések

Ha timeout nulla, a metódus nem blokkolja a elemet. Teszteli a várakozási fogópont állapotát, és azonnal visszatér.

A metódus hívója addig blokkolja a hívót, amíg az aktuális példány nem kap jelet, vagy időtúllépés történik. Ezzel a módszerrel blokkolhatja, amíg egy WaitHandle másik száltól nem kap jelet, például amikor egy aszinkron művelet befejeződik. További információ: IAsyncResult felület.

A metódus felülbírálása a származtatott osztályok viselkedésének testreszabásához.

A maximális érték az timeout .Int32.MaxValue

A metódus túlterhelésének meghívása ugyanaz, mint a WaitOne(TimeSpan, Boolean) túlterhelés meghívása falseexitContext és a túlterhelés megadása.

A következőre érvényes:

WaitOne(Int32, Boolean)

Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs

Blokkolja az aktuális szálat, amíg az aktuális WaitHandle nem kap jelet, egy 32 bites aláírt egész számmal adja meg az időintervallumot, és adja meg, hogy a várakozás előtt ki kell-e lépnie a szinkronizálási tartományból.

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

Paraméterek

millisecondsTimeout
Int32

A várakozni kívánt ezredmásodpercek száma, vagy Infinite (-1) a határozatlan ideig történő várakozáshoz.

exitContext
Boolean

truea várakozás előtt (ha szinkronizált környezetben) ki szeretne lépni a környezet szinkronizálási tartományból, és ezt követően újból meg kell keresnie; egyéb esetben. false

Válaszok

trueha az aktuális példány jelet kap; egyéb esetben. false

Kivételek

Az aktuális példány már el lett adva.

millisecondsTimeout a negatív szám nem -1, ami végtelen időtúllépést jelöl.

A várakozás befejeződött, mert egy szál a mutex feloldása nélkül lépett ki.

Az aktuális példány egy transzparens proxy egy WaitHandle másik alkalmazástartományban.

Példák

Az alábbi példa bemutatja, hogyan viselkedik a WaitOne(Int32, Boolean) metódus túlterhelése, amikor egy szinkronizálási tartományon belül hívják meg. Először egy szál a várakozási exitContext időkorlát lejáratáig várakozikfalse, és letiltja azt. A második szál az első szál leállása után fut, és a exitContext következőre van állítva true: . A második szál várakozási fogópontjának jelzésére szolgáló hívás nincs blokkolva, és a szál a várakozási időkorlát előtt befejeződik.

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

Megjegyzések

Ha millisecondsTimeout nulla, a metódus nem blokkolja a elemet. Teszteli a várakozási fogópont állapotát, és azonnal visszatér.

Ha egy mutex elhagyatott, egy AbandonedMutexException dobni. Az elhagyott mutex gyakran komoly kódolási hibát jelez. Rendszerszintű mutex esetén azt jelezheti, hogy egy alkalmazás hirtelen leállt (például Windows Task Manager használatával). A kivétel a hibakereséshez hasznos információkat tartalmaz.

A metódus hívója addig blokkolja a hívót, amíg az aktuális példány nem kap jelet, vagy időtúllépés történik. Ezzel a módszerrel blokkolhatja, amíg egy WaitHandle másik száltól nem kap jelet, például amikor egy aszinkron művelet befejeződik. További információ: IAsyncResult felület.

A metódus felülbírálása a származtatott osztályok viselkedésének testreszabásához.

Kilépés a környezetből

A exitContext paraméternek nincs hatása, hacsak ezt a metódust nem egy nem megbízható felügyelt környezetből hívja meg. A felügyelt környezet nem lehet hibás, ha a szál egy, a forrásból ContextBoundObjectszármaztatott osztály egy példányának hívásán belül van. Még akkor is, ha egy olyan osztályon hajt végre metódust, amely nem származik ContextBoundObjectpéldául Stringabból, akkor is lehet nem megfelelő környezetben, ha egy ContextBoundObject az aktuális alkalmazástartományban található a veremen.

Ha a kód nem megfelelő környezetben fut, a metódus végrehajtása előtt meg kell adnia trueexitContext , hogy a szál kilép-e a nemdefault felügyelt környezetből (vagyis áttér az alapértelmezett környezetre). A szál a metódus hívásának befejeződése után visszatér az eredeti nem megfelelő környezethez.

A környezetből való kilépés akkor lehet hasznos, ha a környezethez kötött osztály rendelkezik az SynchronizationAttribute attribútummal. Ebben az esetben a rendszer automatikusan szinkronizálja az osztály tagjaihoz intézett összes hívást, és a szinkronizálási tartomány az osztály kódjának teljes törzse. Ha egy tag hívási vermében lévő kód meghívja ezt a metódust, és megadja trueexitContextazt, a szál kilép a szinkronizálási tartományból, ami lehetővé teszi, hogy az objektum bármely tagjára irányuló hívás során blokkolt szál folytassa a műveletet. Amikor ez a metódus visszatér, a hívást kezdeményező szálnak várnia kell a szinkronizálási tartomány újraküldésére.

A következőre érvényes:

WaitOne(TimeSpan, Boolean)

Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs

Letiltja az aktuális szálat, amíg az aktuális példány nem kap jelet, az időintervallum megadásához és annak megadásához, TimeSpan hogy a várakozás előtt kilépjen-e a szinkronizálási tartományból.

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

Paraméterek

timeout
TimeSpan

Ez TimeSpan a várakozási idő ezredmásodperc, vagy egy TimeSpan olyan érték, amely -1 ezredmásodpercet jelöl a határozatlan ideig történő várakozáshoz.

exitContext
Boolean

truea várakozás előtt (ha szinkronizált környezetben) ki szeretne lépni a környezet szinkronizálási tartományból, és ezt követően újból meg kell keresnie; egyéb esetben. false

Válaszok

trueha az aktuális példány jelet kap; egyéb esetben. false

Kivételek

Az aktuális példány már el lett adva.

timeout a -1 ezredmásodpercen kívüli negatív szám, amely végtelen időtúllépést jelöl.

-vagy-

timeout nagyobb, mint az Int32.MaxValue.

A várakozás befejeződött, mert egy szál a mutex feloldása nélkül lépett ki.

Az aktuális példány egy transzparens proxy egy WaitHandle másik alkalmazástartományban.

Példák

Az alábbi példakód bemutatja, hogyan lehet várakozási fogópontot használni, hogy a folyamat ne fejeződjön be, amíg egy háttérszál befejeződik.

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

Megjegyzések

Ha timeout nulla, a metódus nem blokkolja a elemet. Teszteli a várakozási fogópont állapotát, és azonnal visszatér.

Ha egy mutex elhagyatott, egy AbandonedMutexException dobni. Az elhagyott mutex gyakran komoly kódolási hibát jelez. Rendszerszintű mutex esetén azt jelezheti, hogy egy alkalmazás hirtelen leállt (például Windows Task Manager használatával). A kivétel a hibakereséshez hasznos információkat tartalmaz.

A metódus hívója addig blokkolja a hívót, amíg az aktuális példány nem kap jelet, vagy időtúllépés történik. Ezzel a módszerrel blokkolhatja, amíg egy WaitHandle másik száltól nem kap jelet, például amikor egy aszinkron művelet befejeződik. További információ: IAsyncResult felület.

A metódus felülbírálása a származtatott osztályok viselkedésének testreszabásához.

A maximális érték az timeout .Int32.MaxValue

Kilépés a környezetből

A exitContext paraméternek nincs hatása, hacsak ezt a metódust nem egy nem megbízható felügyelt környezetből hívja meg. A felügyelt környezet nem lehet hibás, ha a szál egy, a forrásból ContextBoundObjectszármaztatott osztály egy példányának hívásán belül van. Még akkor is, ha egy olyan osztályon hajt végre metódust, amely nem származik ContextBoundObjectpéldául Stringabból, akkor is lehet nem megfelelő környezetben, ha egy ContextBoundObject az aktuális alkalmazástartományban található a veremen.

Ha a kód nem megfelelő környezetben fut, a metódus végrehajtása előtt meg kell adnia trueexitContext , hogy a szál kilép-e a nemdefault felügyelt környezetből (vagyis áttér az alapértelmezett környezetre). A szál a metódus hívásának befejeződése után visszatér az eredeti nem megfelelő környezethez.

A környezetből való kilépés akkor lehet hasznos, ha a környezethez kötött osztály rendelkezik az SynchronizationAttribute attribútummal. Ebben az esetben a rendszer automatikusan szinkronizálja az osztály tagjaihoz intézett összes hívást, és a szinkronizálási tartomány az osztály kódjának teljes törzse. Ha egy tag hívási vermében lévő kód meghívja ezt a metódust, és megadja trueexitContextazt, a szál kilép a szinkronizálási tartományból, ami lehetővé teszi, hogy az objektum bármely tagjára irányuló hívás során blokkolt szál folytassa a műveletet. Amikor ez a metódus visszatér, a hívást kezdeményező szálnak várnia kell a szinkronizálási tartomány újraküldésére.

A következőre érvényes: