Semaphore Constructors

Definitie

Initialiseert een nieuw exemplaar van de Semaphore klasse.

Overloads

Name Description
Semaphore(Int32, Int32)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven.

Semaphore(Int32, Int32, String)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven en eventueel de naam van een systeemsemaforeobject wordt opgegeven.

Semaphore(Int32, Int32, String, Boolean)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, eventueel de naam van een systeemsemaforeobject wordt opgegeven en een variabele wordt opgegeven die een waarde ontvangt die aangeeft of er een nieuwe systeememafore is gemaakt.

Semaphore(Int32, Int32, String, NamedWaitHandleOptions)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, en eventueel de naam van een systeemsemaphore-object en opties wordt opgegeven om toegang tot het gebruikersbereik en sessiebereik in te stellen.

Semaphore(Int32, Int32, String, Boolean, SemaphoreSecurity)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, optioneel de naam van een systeemmaforeobject opgeeft, een variabele opgeeft die een waarde ontvangt die aangeeft of er een nieuwe systeemmafore is gemaakt en beveiligingstoegangsbeheer voor de systeemsemafore wordt opgegeven.

Semaphore(Int32, Int32, String, NamedWaitHandleOptions, Boolean)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, optioneel de naam van een systeemmaforeobject en opties opgeven om toegang tot gebruikersbereik en sessiebereik in te stellen en een variabele op te geven die een waarde ontvangt die aangeeft of er een nieuwe systeemsemafore is gemaakt.

Semaphore(Int32, Int32)

Bron:
Semaphore.cs
Bron:
Semaphore.cs
Bron:
Semaphore.cs
Bron:
Semaphore.cs
Bron:
Semaphore.cs

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven.

public:
 Semaphore(int initialCount, int maximumCount);
public Semaphore(int initialCount, int maximumCount);
new System.Threading.Semaphore : int * int -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer)

Parameters

initialCount
Int32

Het eerste aantal aanvragen voor de semaphore die gelijktijdig kan worden verleend.

maximumCount
Int32

Het maximum aantal aanvragen voor de semaphore die gelijktijdig kan worden verleend.

Uitzonderingen

initialCount is groter dan maximumCount.

maximumCount is kleiner dan 1.

– of –

initialCount is kleiner dan 0.

Voorbeelden

In het volgende voorbeeld wordt eenemafore gemaakt met een maximumaantal van drie en een eerste telling van nul. In het voorbeeld worden vijf threads gestart, die blok wachten op de semaphore. De hoofdthread gebruikt de overbelasting van de Release(Int32) methode om het aantalemaforen tot het maximum te verhogen, zodat drie threads de semaphore kunnen invoeren. Elke thread gebruikt de Thread.Sleep methode om één seconde te wachten, om werk te simuleren en roept vervolgens de overbelasting van de methode aan om de Release() semafoor vrij te geven. Telkens wanneer deemafore wordt vrijgegeven, wordt het vorige aantal semaphore weergegeven. Consoleberichten houden het gebruik van de semafore bij. Het gesimuleerde werkinterval wordt enigszins verhoogd voor elke thread, zodat de uitvoer gemakkelijker te lezen is.

using System;
using System.Threading;

public class Example
{
    // A semaphore that simulates a limited resource pool.
    //
    private static Semaphore _pool;

    // A padding interval to make the output more orderly.
    private static int _padding;

    public static void Main()
    {
        // Create a semaphore that can satisfy up to three
        // concurrent requests. Use an initial count of zero,
        // so that the entire semaphore count is initially
        // owned by the main program thread.
        //
        _pool = new Semaphore(initialCount: 0, maximumCount: 3);

        // Create and start five numbered threads. 
        //
        for(int i = 1; i <= 5; i++)
        {
            Thread t = new Thread(new ParameterizedThreadStart(Worker));

            // Start the thread, passing the number.
            //
            t.Start(i);
        }

        // Wait for half a second, to allow all the
        // threads to start and to block on the semaphore.
        //
        Thread.Sleep(500);

        // The main thread starts out holding the entire
        // semaphore count. Calling Release(3) brings the 
        // semaphore count back to its maximum value, and
        // allows the waiting threads to enter the semaphore,
        // up to three at a time.
        //
        Console.WriteLine("Main thread calls Release(3).");
        _pool.Release(releaseCount: 3);

        Console.WriteLine("Main thread exits.");
    }

    private static void Worker(object num)
    {
        // Each worker thread begins by requesting the
        // semaphore.
        Console.WriteLine("Thread {0} begins " +
            "and waits for the semaphore.", num);
        _pool.WaitOne();

        // A padding interval to make the output more orderly.
        int padding = Interlocked.Add(ref _padding, 100);

        Console.WriteLine("Thread {0} enters the semaphore.", num);
        
        // The thread's "work" consists of sleeping for 
        // about a second. Each thread "works" a little 
        // longer, just to make the output more orderly.
        //
        Thread.Sleep(1000 + padding);

        Console.WriteLine("Thread {0} releases the semaphore.", num);
        Console.WriteLine("Thread {0} previous semaphore count: {1}",
            num, _pool.Release());
    }
}
Imports System.Threading

Public Class Example

    ' A semaphore that simulates a limited resource pool.
    '
    Private Shared _pool As Semaphore

    ' A padding interval to make the output more orderly.
    Private Shared _padding As Integer

    <MTAThread> _
    Public Shared Sub Main()
        ' Create a semaphore that can satisfy up to three
        ' concurrent requests. Use an initial count of zero,
        ' so that the entire semaphore count is initially
        ' owned by the main program thread.
        '
        _pool = New Semaphore(0, 3)

        ' Create and start five numbered threads. 
        '
        For i As Integer = 1 To 5
            Dim t As New Thread(New ParameterizedThreadStart(AddressOf Worker))
            'Dim t As New Thread(AddressOf Worker)

            ' Start the thread, passing the number.
            '
            t.Start(i)
        Next i

        ' Wait for half a second, to allow all the
        ' threads to start and to block on the semaphore.
        '
        Thread.Sleep(500)

        ' The main thread starts out holding the entire
        ' semaphore count. Calling Release(3) brings the 
        ' semaphore count back to its maximum value, and
        ' allows the waiting threads to enter the semaphore,
        ' up to three at a time.
        '
        Console.WriteLine("Main thread calls Release(3).")
        _pool.Release(3)

        Console.WriteLine("Main thread exits.")
    End Sub

    Private Shared Sub Worker(ByVal num As Object)
        ' Each worker thread begins by requesting the
        ' semaphore.
        Console.WriteLine("Thread {0} begins " _
            & "and waits for the semaphore.", num)
        _pool.WaitOne()

        ' A padding interval to make the output more orderly.
        Dim padding As Integer = Interlocked.Add(_padding, 100)

        Console.WriteLine("Thread {0} enters the semaphore.", num)
        
        ' The thread's "work" consists of sleeping for 
        ' about a second. Each thread "works" a little 
        ' longer, just to make the output more orderly.
        '
        Thread.Sleep(1000 + padding)

        Console.WriteLine("Thread {0} releases the semaphore.", num)
        Console.WriteLine("Thread {0} previous semaphore count: {1}", _
            num, _
            _pool.Release())
    End Sub
End Class

Opmerkingen

Met deze constructor wordt een niet-benoemde semafor geïnitialiseerd. Alle threads die gebruikmaken van een exemplaar van een dergelijke semafore, moeten verwijzingen naar het exemplaar hebben.

Als initialCount dit kleiner is danmaximumCount, is het effect hetzelfde als als de huidige thread (WaitOneminmaximumCount) tijden had aangeroepen initialCount . Als u geen vermeldingen wilt reserveren voor de thread waarmee de semafore wordt gemaakt, gebruikt u hetzelfde getal voor maximumCount en initialCount.

Zie ook

Van toepassing op

Semaphore(Int32, Int32, String)

Bron:
Semaphore.cs
Bron:
Semaphore.cs
Bron:
Semaphore.cs
Bron:
Semaphore.cs
Bron:
Semaphore.cs

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven en eventueel de naam van een systeemsemaforeobject wordt opgegeven.

public:
 Semaphore(int initialCount, int maximumCount, System::String ^ name);
public Semaphore(int initialCount, int maximumCount, string name);
public Semaphore(int initialCount, int maximumCount, string? name);
new System.Threading.Semaphore : int * int * string -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer, name As String)

Parameters

initialCount
Int32

Het eerste aantal aanvragen voor de semaphore die gelijktijdig kan worden verleend.

maximumCount
Int32

Het maximum aantal aanvragen voor de semaphore die gelijktijdig kan worden verleend.

name
String

De naam, als het synchronisatieobject moet worden gedeeld met andere processen; anders of null een lege tekenreeks. De naam is hoofdlettergevoelig. Het backslashteken (\) is gereserveerd en kan alleen worden gebruikt om een naamruimte op te geven. Zie de sectie Opmerkingen voor meer informatie over naamruimten. Er kunnen verdere beperkingen gelden voor de naam, afhankelijk van het besturingssysteem. Op Unix-besturingssystemen moet de naam na het uitsluiten van de naamruimte bijvoorbeeld een geldige bestandsnaam zijn.

Uitzonderingen

initialCount is groter dan maximumCount.

– of –

alleen .NET Framework: name is langer dan MAX_PATH (260 tekens).

maximumCount is kleiner dan 1.

– of –

initialCount is kleiner dan 0.

name is ongeldig. Dit kan om verschillende redenen zijn, waaronder enkele beperkingen die mogelijk door het besturingssysteem worden geplaatst, zoals een onbekend voorvoegsel of ongeldige tekens. Houd er rekening mee dat de naam en algemene voorvoegsels 'Global\' en 'Local\' hoofdlettergevoelig zijn.

– of –

Er is een andere fout opgetreden. De HResult eigenschap biedt mogelijk meer informatie.

alleen Windows: name een onbekende naamruimte opgegeven. Zie Objectnamen voor meer informatie.

Het name is te lang. Lengtebeperkingen kunnen afhankelijk zijn van het besturingssysteem of de configuratie.

De benoemde semaphore bestaat en heeft beveiliging voor toegangsbeheer en de gebruiker heeft geen FullControl.

Een synchronisatieobject met de opgegeven name kan niet worden gemaakt. Een synchronisatieobject van een ander type kan dezelfde naam hebben.

Voorbeelden

In het volgende codevoorbeeld ziet u het gedrag van een benoemde semafore. In het voorbeeld wordt een benoemde semaphore gemaakt met een maximumaantal van vijf en een eerste telling van vijf. Het programma roept drie aanroepen naar de WaitOne methode. Als u het gecompileerde voorbeeld dus uitvoert vanuit twee opdrachtvensters, wordt de tweede kopie geblokkeerd bij de derde aanroep naar WaitOne. Laat een of meer vermeldingen in de eerste kopie van het programma los om de blokkering van de tweede op te heffen.

using System;
using System.Threading;

public class Example
{
    public static void Main()
    {
        // Create a Semaphore object that represents the named 
        // system semaphore "SemaphoreExample3". The semaphore has a
        // maximum count of five. The initial count is also five. 
        // There is no point in using a smaller initial count,
        // because the initial count is not used if this program
        // doesn't create the named system semaphore, and with 
        // this method overload there is no way to tell. Thus, this
        // program assumes that it is competing with other
        // programs for the semaphore.
        //
        Semaphore sem = new Semaphore(5, 5, "SemaphoreExample3");

        // Attempt to enter the semaphore three times. If another 
        // copy of this program is already running, only the first
        // two requests can be satisfied. The third blocks. Note 
        // that in a real application, timeouts should be used
        // on the WaitOne calls, to avoid deadlocks.
        //
        sem.WaitOne();
        Console.WriteLine("Entered the semaphore once.");
        sem.WaitOne();
        Console.WriteLine("Entered the semaphore twice.");
        sem.WaitOne();
        Console.WriteLine("Entered the semaphore three times.");

        // The thread executing this program has entered the 
        // semaphore three times. If a second copy of the program
        // is run, it will block until this program releases the 
        // semaphore at least once.
        //
        Console.WriteLine("Enter the number of times to call Release.");
        int n;
        if (int.TryParse(Console.ReadLine(), out n))
        {
            sem.Release(n);
        }

        int remaining = 3 - n;
        if (remaining > 0)
        {
            Console.WriteLine("Press Enter to release the remaining " +
                "count ({0}) and exit the program.", remaining);
            Console.ReadLine();
            sem.Release(remaining);
        }
    }
}
Imports System.Threading

Public Class Example

    <MTAThread> _
    Public Shared Sub Main()
        ' Create a Semaphore object that represents the named 
        ' system semaphore "SemaphoreExample3". The semaphore has a
        ' maximum count of five. The initial count is also five. 
        ' There is no point in using a smaller initial count,
        ' because the initial count is not used if this program
        ' doesn't create the named system semaphore, and with 
        ' this method overload there is no way to tell. Thus, this
        ' program assumes that it is competing with other
        ' programs for the semaphore.
        '
        Dim sem As New Semaphore(5, 5, "SemaphoreExample3")

        ' Attempt to enter the semaphore three times. If another 
        ' copy of this program is already running, only the first
        ' two requests can be satisfied. The third blocks. Note 
        ' that in a real application, timeouts should be used
        ' on the WaitOne calls, to avoid deadlocks.
        '
        sem.WaitOne()
        Console.WriteLine("Entered the semaphore once.")
        sem.WaitOne()
        Console.WriteLine("Entered the semaphore twice.")
        sem.WaitOne()
        Console.WriteLine("Entered the semaphore three times.")

        ' The thread executing this program has entered the 
        ' semaphore three times. If a second copy of the program
        ' is run, it will block until this program releases the 
        ' semaphore at least once.
        '
        Console.WriteLine("Enter the number of times to call Release.")
        Dim n As Integer
        If Integer.TryParse(Console.ReadLine(), n) Then
            sem.Release(n)
        End If

        Dim remaining As Integer = 3 - n
        If (remaining) > 0 Then
            Console.WriteLine("Press Enter to release the remaining " _
                & "count ({0}) and exit the program.", remaining)
            Console.ReadLine()
            sem.Release(remaining)
        End If

    End Sub 
End Class

Opmerkingen

Met deze constructor wordt een Semaphore object geïnitialiseerd dat een benoemd systeemsemafore vertegenwoordigt. U kunt meerdere Semaphore objecten maken die dezelfde benoemde systeememafore vertegenwoordigen.

De name naamruimte kan worden voorafgegaan door Global\ of Local\ om een naamruimte op te geven. Wanneer de Global naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen op het systeem. Wanneer de Local naamruimte is opgegeven, wat ook de standaardwaarde is wanneer er geen naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen in dezelfde sessie. Op Windows is een sessie een aanmeldingssessie en worden services meestal uitgevoerd in een andere niet-interactieve sessie. Op Unix-achtige besturingssystemen heeft elke shell een eigen sessie. Sessie-lokale synchronisatieobjecten zijn mogelijk geschikt voor synchronisatie tussen processen met een bovenliggende/onderliggende relatie, waar ze allemaal in dezelfde sessie worden uitgevoerd. Zie Objectnamen voor meer informatie over de namen van synchronisatieobjecten in Windows.

Als er een name is opgegeven en er al een synchronisatieobject van het aangevraagde type bestaat in de naamruimte, wordt het bestaande synchronisatieobject gebruikt. Als er al een synchronisatieobject van een ander type bestaat in de naamruimte, wordt er een WaitHandleCannotBeOpenedException gegenereerd. Anders wordt er een nieuw synchronisatieobject gemaakt.

Als de benoemde systeememafore niet bestaat, wordt deze gemaakt met het aanvankelijke aantal en het maximumaantal dat is opgegeven door initialCount en maximumCount. Als de benoemde systeememafore al bestaat initialCount en maximumCount niet wordt gebruikt, hoewel ongeldige waarden nog steeds uitzonderingen veroorzaken. Als u wilt bepalen of er al dan niet een benoemd systeemsemafore is gemaakt, gebruikt u in plaats daarvan de overbelasting van de Semaphore(Int32, Int32, String, Boolean) constructor.

Important

Wanneer u deze constructoroverbelasting gebruikt, is de aanbevolen procedure om hetzelfde getal op te geven voor initialCount en maximumCount. Als initialCount deze kleiner is dan maximumCounten er een benoemd systeemsemafore wordt gemaakt, is het effect hetzelfde als als de huidige thread (WaitOneminmaximumCount) tijden had aangeroepen initialCount . Met deze constructoroverbelasting is er echter geen manier om te bepalen of er een benoemd systeemsemafore is gemaakt.

Als u opgeeft null of een lege tekenreeks voor name, wordt er een lokale semafore gemaakt, alsof u de Semaphore(Int32, Int32) constructor-overbelasting had genoemd.

Omdat benoemde semaphores zichtbaar zijn in het hele besturingssysteem, kunnen ze worden gebruikt om het resourcegebruik te coördineren over procesgrenzen.

Als u wilt weten of er een benoemd systeemsemafore bestaat, gebruikt u de OpenExisting methode. De OpenExisting methode probeert een bestaande benoemde semafore te openen en genereert een uitzondering als de systeememafore niet bestaat.

Caution

Standaard is een benoemde semafore niet beperkt tot de gebruiker die deze heeft gemaakt. Andere gebruikers kunnen mogelijk deemafore openen en gebruiken, waaronder het verstoren van de semafore door de semafor meerdere keren te verkrijgen en niet vrij te geven. Als u de toegang tot specifieke gebruikers wilt beperken, kunt u een overbelasting van een constructor gebruiken of SemaphoreAcl een SemaphoreSecurity doorgeven bij het maken van de benoemde semafore. Vermijd het gebruik van benoemde semaforen zonder toegangsbeperkingen voor systemen die mogelijk niet-vertrouwde gebruikers code laten uitvoeren.

Zie ook

Van toepassing op

Semaphore(Int32, Int32, String, Boolean)

Bron:
Semaphore.cs
Bron:
Semaphore.cs
Bron:
Semaphore.cs
Bron:
Semaphore.cs
Bron:
Semaphore.cs

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, eventueel de naam van een systeemsemaforeobject wordt opgegeven en een variabele wordt opgegeven die een waarde ontvangt die aangeeft of er een nieuwe systeememafore is gemaakt.

public:
 Semaphore(int initialCount, int maximumCount, System::String ^ name, [Runtime::InteropServices::Out] bool % createdNew);
public Semaphore(int initialCount, int maximumCount, string name, out bool createdNew);
public Semaphore(int initialCount, int maximumCount, string? name, out bool createdNew);
new System.Threading.Semaphore : int * int * string * bool -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer, name As String, ByRef createdNew As Boolean)

Parameters

initialCount
Int32

Het eerste aantal aanvragen voor de semaphore dat gelijktijdig kan worden voldaan.

maximumCount
Int32

Het maximum aantal aanvragen voor de semaphore dat gelijktijdig kan worden voldaan.

name
String

De naam, als het synchronisatieobject moet worden gedeeld met andere processen; anders of null een lege tekenreeks. De naam is hoofdlettergevoelig. Het backslashteken (\) is gereserveerd en kan alleen worden gebruikt om een naamruimte op te geven. Zie de sectie Opmerkingen voor meer informatie over naamruimten. Er kunnen verdere beperkingen gelden voor de naam, afhankelijk van het besturingssysteem. Op Unix-besturingssystemen moet de naam na het uitsluiten van de naamruimte bijvoorbeeld een geldige bestandsnaam zijn.

createdNew
Boolean

Wanneer deze methode retourneert, bevat dit true als er een lokale semafore is gemaakt (dat wil gezegd, of namenull een lege tekenreeks) of als de opgegeven benoemde systeemsemafore is gemaakt; false als de opgegeven benoemde systeememafore al bestond. Deze parameter wordt niet-geïnitialiseerd doorgegeven.

Uitzonderingen

initialCount is groter dan maximumCount.

– of –

alleen .NET Framework: name is langer dan MAX_PATH (260 tekens).

maximumCount is kleiner dan 1.

– of –

initialCount is kleiner dan 0.

name is ongeldig. Dit kan om verschillende redenen zijn, waaronder enkele beperkingen die mogelijk door het besturingssysteem worden geplaatst, zoals een onbekend voorvoegsel of ongeldige tekens. Houd er rekening mee dat de naam en algemene voorvoegsels 'Global\' en 'Local\' hoofdlettergevoelig zijn.

– of –

Er is een andere fout opgetreden. De HResult eigenschap biedt mogelijk meer informatie.

alleen Windows: name een onbekende naamruimte opgegeven. Zie Objectnamen voor meer informatie.

Het name is te lang. Lengtebeperkingen kunnen afhankelijk zijn van het besturingssysteem of de configuratie.

De benoemde semaphore bestaat en heeft beveiliging voor toegangsbeheer en de gebruiker heeft geen FullControl.

Een synchronisatieobject met de opgegeven name kan niet worden gemaakt. Een synchronisatieobject van een ander type kan dezelfde naam hebben.

Voorbeelden

In het volgende codevoorbeeld ziet u het gedrag van een benoemde semafore. In het voorbeeld wordt een benoemde semaphore gemaakt met een maximumaantal van vijf en een eerste telling van twee. Dat wil gezegd, het behoudt drie vermeldingen voor de thread die de constructor aanroept. Als createNew dat het is false, voert het programma drie aanroepen naar de WaitOne methode uit. Als u het gecompileerde voorbeeld dus uitvoert vanuit twee opdrachtvensters, wordt de tweede kopie geblokkeerd bij de derde aanroep naar WaitOne. Laat een of meer vermeldingen in de eerste kopie van het programma los om de blokkering van de tweede op te heffen.

using System;
using System.Threading;

public class Example
{
    public static void Main()
    {
        // The value of this variable is set by the semaphore
        // constructor. It is true if the named system semaphore was
        // created, and false if the named semaphore already existed.
        //
        bool semaphoreWasCreated;

        // Create a Semaphore object that represents the named 
        // system semaphore "SemaphoreExample". The semaphore has a
        // maximum count of five, and an initial count of two. The
        // Boolean value that indicates creation of the underlying 
        // system object is placed in semaphoreWasCreated.
        //
        Semaphore sem = new Semaphore(2, 5, "SemaphoreExample", 
            out semaphoreWasCreated);

        if (semaphoreWasCreated)
        {
            // If the named system semaphore was created, its count is
            // set to the initial count requested in the constructor.
            // In effect, the current thread has entered the semaphore
            // three times.
            // 
            Console.WriteLine("Entered the semaphore three times.");
        }
        else
        {      
            // If the named system semaphore was not created,  
            // attempt to enter it three times. If another copy of
            // this program is already running, only the first two
            // requests can be satisfied. The third blocks.
            //
            sem.WaitOne();
            Console.WriteLine("Entered the semaphore once.");
            sem.WaitOne();
            Console.WriteLine("Entered the semaphore twice.");
            sem.WaitOne();
            Console.WriteLine("Entered the semaphore three times.");
        }

        // The thread executing this program has entered the 
        // semaphore three times. If a second copy of the program
        // is run, it will block until this program releases the 
        // semaphore at least once.
        //
        Console.WriteLine("Enter the number of times to call Release.");
        int n;
        if (int.TryParse(Console.ReadLine(), out n))
        {
            sem.Release(n);
        }

        int remaining = 3 - n;
        if (remaining > 0)
        {
            Console.WriteLine("Press Enter to release the remaining " +
                "count ({0}) and exit the program.", remaining);
            Console.ReadLine();
            sem.Release(remaining);
        }
    } 
}
Imports System.Threading

Public Class Example

    <MTAThread> _
    Public Shared Sub Main()
        ' The value of this variable is set by the semaphore
        ' constructor. It is True if the named system semaphore was
        ' created, and False if the named semaphore already existed.
        '
        Dim semaphoreWasCreated As Boolean

        ' Create a Semaphore object that represents the named 
        ' system semaphore "SemaphoreExample". The semaphore has a
        ' maximum count of five, and an initial count of two. The
        ' Boolean value that indicates creation of the underlying 
        ' system object is placed in semaphoreWasCreated.
        '
        Dim sem As New Semaphore(2, 5, "SemaphoreExample", _
            semaphoreWasCreated)

        If semaphoreWasCreated Then
            ' If the named system semaphore was created, its count is
            ' set to the initial count requested in the constructor.
            ' In effect, the current thread has entered the semaphore
            ' three times.
            ' 
            Console.WriteLine("Entered the semaphore three times.")
        Else
            ' If the named system semaphore was not created,  
            ' attempt to enter it three times. If another copy of
            ' this program is already running, only the first two
            ' requests can be satisfied. The third blocks.
            '
            sem.WaitOne()
            Console.WriteLine("Entered the semaphore once.")
            sem.WaitOne()
            Console.WriteLine("Entered the semaphore twice.")
            sem.WaitOne()
            Console.WriteLine("Entered the semaphore three times.")
        End If

        ' The thread executing this program has entered the 
        ' semaphore three times. If a second copy of the program
        ' is run, it will block until this program releases the 
        ' semaphore at least once.
        '
        Console.WriteLine("Enter the number of times to call Release.")
        Dim n As Integer
        If Integer.TryParse(Console.ReadLine(), n) Then
            sem.Release(n)
        End If

        Dim remaining As Integer = 3 - n
        If (remaining) > 0 Then
            Console.WriteLine("Press Enter to release the remaining " _
                & "count ({0}) and exit the program.", remaining)
            Console.ReadLine()
            sem.Release(remaining)
        End If

    End Sub 
End Class

Opmerkingen

De name naamruimte kan worden voorafgegaan door Global\ of Local\ om een naamruimte op te geven. Wanneer de Global naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen op het systeem. Wanneer de Local naamruimte is opgegeven, wat ook de standaardwaarde is wanneer er geen naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen in dezelfde sessie. Op Windows is een sessie een aanmeldingssessie en worden services meestal uitgevoerd in een andere niet-interactieve sessie. Op Unix-achtige besturingssystemen heeft elke shell een eigen sessie. Sessie-lokale synchronisatieobjecten zijn mogelijk geschikt voor synchronisatie tussen processen met een bovenliggende/onderliggende relatie, waar ze allemaal in dezelfde sessie worden uitgevoerd. Zie Objectnamen voor meer informatie over de namen van synchronisatieobjecten in Windows.

Als er een name is opgegeven en er al een synchronisatieobject van het aangevraagde type bestaat in de naamruimte, wordt het bestaande synchronisatieobject gebruikt. Als er al een synchronisatieobject van een ander type bestaat in de naamruimte, wordt er een WaitHandleCannotBeOpenedException gegenereerd. Anders wordt er een nieuw synchronisatieobject gemaakt.

Met deze constructor wordt een Semaphore object geïnitialiseerd dat een benoemd systeemsemafore vertegenwoordigt. U kunt meerdere Semaphore objecten maken die dezelfde benoemde systeememafore vertegenwoordigen.

Als de benoemde systeememafore niet bestaat, wordt deze gemaakt met het aanvankelijke aantal en het maximumaantal dat is opgegeven door initialCount en maximumCount. Als de benoemde systeememafore al bestaat initialCount en maximumCount niet wordt gebruikt, hoewel ongeldige waarden nog steeds uitzonderingen veroorzaken. Gebruik createdNew dit om te bepalen of de systeemsemafore is gemaakt.

Als initialCount dit kleiner is dan maximumCounten createdNew is, is truehet effect hetzelfde als als de huidige thread (WaitOneminmaximumCount) tijden had aangeroepen initialCount .

Als u opgeeft null of een lege tekenreeks voor name, wordt er een lokale semafore gemaakt, alsof u de Semaphore(Int32, Int32) constructor-overbelasting had genoemd. In dit geval createdNew is dat altijd true.

Omdat benoemde semaphores zichtbaar zijn in het hele besturingssysteem, kunnen ze worden gebruikt om het resourcegebruik te coördineren over procesgrenzen.

Caution

Standaard is een benoemde semafore niet beperkt tot de gebruiker die deze heeft gemaakt. Andere gebruikers kunnen mogelijk deemafore openen en gebruiken, waaronder het verstoren van de semafore door de semafor meerdere keren te verkrijgen en niet vrij te geven. Als u de toegang tot specifieke gebruikers wilt beperken, kunt u een overbelasting van een constructor gebruiken of SemaphoreAcl een SemaphoreSecurity doorgeven bij het maken van de benoemde semafore. Vermijd het gebruik van benoemde semaforen zonder toegangsbeperkingen voor systemen die mogelijk niet-vertrouwde gebruikers code laten uitvoeren.

Zie ook

Van toepassing op

Semaphore(Int32, Int32, String, NamedWaitHandleOptions)

Bron:
Semaphore.cs
Bron:
Semaphore.cs

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, en eventueel de naam van een systeemsemaphore-object en opties wordt opgegeven om toegang tot het gebruikersbereik en sessiebereik in te stellen.

public:
 Semaphore(int initialCount, int maximumCount, System::String ^ name, System::Threading::NamedWaitHandleOptions options);
public Semaphore(int initialCount, int maximumCount, string? name, System.Threading.NamedWaitHandleOptions options);
new System.Threading.Semaphore : int * int * string * System.Threading.NamedWaitHandleOptions -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer, name As String, options As NamedWaitHandleOptions)

Parameters

initialCount
Int32

Het eerste aantal aanvragen voor de semaphore dat gelijktijdig kan worden voldaan.

maximumCount
Int32

Het maximum aantal aanvragen voor de semaphore dat gelijktijdig kan worden voldaan.

name
String

De naam, als het synchronisatieobject moet worden gedeeld met andere processen; anders of null een lege tekenreeks. De naam is hoofdlettergevoelig.

options
NamedWaitHandleOptions

De bereikopties voor de benoemde semaphore. De standaardinstelling is alleen toegankelijk voor de huidige gebruiker en de huidige sessie. De opgegeven opties kunnen van invloed zijn op de naamruimte voor de naam en toegang tot het onderliggende semaphore-object.

Uitzonderingen

initialCount is groter dan maximumCount.

– of –

initialCount is kleiner dan 0.

name is ongeldig. Dit kan om verschillende redenen zijn, waaronder enkele beperkingen die mogelijk door het besturingssysteem worden geplaatst, zoals een onbekend voorvoegsel of ongeldige tekens. Houd er rekening mee dat de naam en algemene voorvoegsels 'Global\' en 'Local\' hoofdlettergevoelig zijn.

– of –

Er is een andere fout opgetreden. De HResult eigenschap biedt mogelijk meer informatie.

alleen Windows: name een onbekende naamruimte opgegeven. Zie Objectnamen voor meer informatie.

Het name is te lang. Lengtebeperkingen kunnen afhankelijk zijn van het besturingssysteem of de configuratie.

De benoemde semaphore bestaat en heeft beveiliging voor toegangsbeheer en de gebruiker heeft geen FullControl.

Een synchronisatieobject met de opgegeven name kan niet worden gemaakt. Een synchronisatieobject van een ander type kan dezelfde naam hebben.

– of –

Er bestaat een object met de opgegeven waarde, maar de opgegeven nameoptions objecten zijn niet compatibel met de opties van het bestaande object.

Opmerkingen

Met deze constructor wordt een Semaphore object geïnitialiseerd dat een benoemd systeemsemafore vertegenwoordigt. U kunt meerdere Semaphore objecten maken die dezelfde benoemde systeememafore vertegenwoordigen.

Als er een name is opgegeven en er al een synchronisatieobject van het aangevraagde type bestaat in de naamruimte, wordt het bestaande synchronisatieobject gebruikt, tenzij options de toegang beperkt is tot de huidige gebruiker en het synchronisatieobject niet compatibel is met het object, in welk geval er een WaitHandleCannotBeOpenedException wordt gegenereerd. Als er al een synchronisatieobject van een ander type in de naamruimte bestaat, wordt er ook een WaitHandleCannotBeOpenedException gegenereerd. Anders wordt er een nieuw synchronisatieobject gemaakt.

Als de benoemde systeememafore niet bestaat, wordt deze gemaakt met het aanvankelijke aantal en het maximumaantal dat is opgegeven door initialCount en maximumCount. Als de benoemde systeememafore al bestaat initialCount en maximumCount niet wordt gebruikt, hoewel ongeldige waarden nog steeds uitzonderingen veroorzaken. Als u wilt bepalen of er al dan niet een benoemd systeemsemafore is gemaakt, gebruikt u in plaats daarvan de overbelasting van de Semaphore(Int32, Int32, String, Boolean) constructor.

Important

Wanneer u deze constructoroverbelasting gebruikt, is de aanbevolen procedure om hetzelfde getal op te geven voor initialCount en maximumCount. Als initialCount deze kleiner is dan maximumCounten er een benoemd systeemsemafore wordt gemaakt, is het effect hetzelfde als als de huidige thread (WaitOneminmaximumCount) tijden had aangeroepen initialCount . Bij deze overbelasting van de constructor is er echter geen manier om te bepalen of er een benoemd systeemsemafore is gemaakt.

Als u opgeeft null of een lege tekenreeks voor name, wordt er een lokale semafore gemaakt, alsof u de Semaphore(Int32, Int32) constructor-overbelasting had genoemd.

Omdat benoemde semaphores zichtbaar zijn in het hele besturingssysteem, kunnen ze worden gebruikt om het resourcegebruik te coördineren over procesgrenzen.

Als u wilt weten of er een benoemd systeemsemafore bestaat, gebruikt u de OpenExisting methode. De OpenExisting methode probeert een bestaande benoemde semafore te openen en genereert een uitzondering als de systeememafore niet bestaat.

Op Windows kan options worden opgegeven om op te geven of de benoemde semaphore alleen toegankelijk is voor de huidige gebruiker of voor alle gebruikers. Hiermee kunt u ook opgeven of de benoemde semaphore alleen toegankelijk is voor processen in de huidige sessie of voor alle sessies. Zie NamedWaitHandleOptions voor meer informatie.

Caution

Op Unix-besturingssystemen heeft de options parameter geen effect omdat benoemde semaphores niet worden ondersteund.

Zie ook

Van toepassing op

Semaphore(Int32, Int32, String, Boolean, SemaphoreSecurity)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, optioneel de naam van een systeemmaforeobject opgeeft, een variabele opgeeft die een waarde ontvangt die aangeeft of er een nieuwe systeemmafore is gemaakt en beveiligingstoegangsbeheer voor de systeemsemafore wordt opgegeven.

public:
 Semaphore(int initialCount, int maximumCount, System::String ^ name, [Runtime::InteropServices::Out] bool % createdNew, System::Security::AccessControl::SemaphoreSecurity ^ semaphoreSecurity);
public Semaphore(int initialCount, int maximumCount, string name, out bool createdNew, System.Security.AccessControl.SemaphoreSecurity semaphoreSecurity);
new System.Threading.Semaphore : int * int * string * bool * System.Security.AccessControl.SemaphoreSecurity -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer, name As String, ByRef createdNew As Boolean, semaphoreSecurity As SemaphoreSecurity)

Parameters

initialCount
Int32

Het eerste aantal aanvragen voor de semaphore dat gelijktijdig kan worden voldaan.

maximumCount
Int32

Het maximum aantal aanvragen voor de semaphore dat gelijktijdig kan worden voldaan.

name
String

De naam, als het synchronisatieobject moet worden gedeeld met andere processen; anders of null een lege tekenreeks. De naam is hoofdlettergevoelig. Het backslashteken (\) is gereserveerd en kan alleen worden gebruikt om een naamruimte op te geven. Zie de sectie Opmerkingen voor meer informatie over naamruimten. Er kunnen verdere beperkingen gelden voor de naam, afhankelijk van het besturingssysteem. Op Unix-besturingssystemen moet de naam na het uitsluiten van de naamruimte bijvoorbeeld een geldige bestandsnaam zijn.

createdNew
Boolean

Wanneer deze methode retourneert, bevat dit true als er een lokale semafore is gemaakt (dat wil gezegd, of namenull een lege tekenreeks) of als de opgegeven benoemde systeemsemafore is gemaakt; false als de opgegeven benoemde systeememafore al bestond. Deze parameter wordt niet-geïnitialiseerd doorgegeven.

semaphoreSecurity
SemaphoreSecurity

Een SemaphoreSecurity object dat de beveiliging van toegangsbeheer vertegenwoordigt die moet worden toegepast op de benoemde systeemsemafore.

Uitzonderingen

initialCount is groter dan maximumCount.

– of –

alleen .NET Framework: name is langer dan MAX_PATH (260 tekens).

maximumCount is kleiner dan 1.

– of –

initialCount is kleiner dan 0.

De benoemde semaphore bestaat en heeft beveiliging voor toegangsbeheer en de gebruiker heeft geen FullControl.

name is ongeldig. Dit kan om verschillende redenen zijn, waaronder enkele beperkingen die mogelijk door het besturingssysteem worden geplaatst, zoals een onbekend voorvoegsel of ongeldige tekens. Houd er rekening mee dat de naam en algemene voorvoegsels 'Global\' en 'Local\' hoofdlettergevoelig zijn.

– of –

Er is een andere fout opgetreden. De HResult eigenschap biedt mogelijk meer informatie.

alleen Windows: name een onbekende naamruimte opgegeven. Zie Objectnamen voor meer informatie.

Het name is te lang. Lengtebeperkingen kunnen afhankelijk zijn van het besturingssysteem of de configuratie.

Een synchronisatieobject met de opgegeven name kan niet worden gemaakt. Een synchronisatieobject van een ander type kan dezelfde naam hebben.

Voorbeelden

In het volgende codevoorbeeld ziet u het gedrag van een benoemde semaphore met beveiliging van toegangsbeheer. In het voorbeeld wordt de overbelasting van de OpenExisting(String) methode gebruikt om te testen op het bestaan van een benoemde semafore. Als de semaphore niet bestaat, wordt deze gemaakt met een maximumaantal van twee en met toegangsbeheerbeveiliging die de huidige gebruiker het recht weigert om deemafore te gebruiken, maar verleent het recht om machtigingen voor lezen en wijzigen voor de semaphore te lezen en te wijzigen. Als u het gecompileerde voorbeeld uitvoert vanuit twee opdrachtvensters, genereert de tweede kopie een uitzondering voor toegangsschending bij de aanroep naar de OpenExisting(String) methode. De uitzondering wordt gevangen en het voorbeeld gebruikt de overbelasting van de OpenExisting(String, SemaphoreRights) methode om de semafoor te openen met de rechten die nodig zijn om de machtigingen te lezen en te wijzigen.

Nadat de machtigingen zijn gewijzigd, wordt deemafore geopend met de rechten die nodig zijn om in te voeren en vrij te geven. Als u het gecompileerde voorbeeld uitvoert vanuit een derde opdrachtvenster, wordt het uitgevoerd met behulp van de nieuwe machtigingen.

using System;
using System.Threading;
using System.Security.AccessControl;

internal class Example
{
    internal static void Main()
    {
        const string semaphoreName = "SemaphoreExample5";

        Semaphore sem = null;
        bool doesNotExist = false;
        bool unauthorized = false;

        // Attempt to open the named semaphore.
        try
        {
            // Open the semaphore with (SemaphoreRights.Synchronize
            // | SemaphoreRights.Modify), to enter and release the
            // named semaphore.
            //
            sem = Semaphore.OpenExisting(semaphoreName);
        }
        catch(WaitHandleCannotBeOpenedException)
        {
            Console.WriteLine("Semaphore does not exist.");
            doesNotExist = true;
        }
        catch(UnauthorizedAccessException ex)
        {
            Console.WriteLine("Unauthorized access: {0}", ex.Message);
            unauthorized = true;
        }

        // There are three cases: (1) The semaphore does not exist.
        // (2) The semaphore exists, but the current user doesn't 
        // have access. (3) The semaphore exists and the user has
        // access.
        //
        if (doesNotExist)
        {
            // The semaphore does not exist, so create it.
            //
            // The value of this variable is set by the semaphore
            // constructor. It is true if the named system semaphore was
            // created, and false if the named semaphore already existed.
            //
            bool semaphoreWasCreated;

            // Create an access control list (ACL) that denies the
            // current user the right to enter or release the 
            // semaphore, but allows the right to read and change
            // security information for the semaphore.
            //
            string user = Environment.UserDomainName + "\\" 
                + Environment.UserName;
            SemaphoreSecurity semSec = new SemaphoreSecurity();

            SemaphoreAccessRule rule = new SemaphoreAccessRule(
                user, 
                SemaphoreRights.Synchronize | SemaphoreRights.Modify, 
                AccessControlType.Deny);
            semSec.AddAccessRule(rule);

            rule = new SemaphoreAccessRule(
                user, 
                SemaphoreRights.ReadPermissions | SemaphoreRights.ChangePermissions,
                AccessControlType.Allow);
            semSec.AddAccessRule(rule);

            // Create a Semaphore object that represents the system
            // semaphore named by the constant 'semaphoreName', with
            // maximum count three, initial count three, and the
            // specified security access. The Boolean value that 
            // indicates creation of the underlying system object is
            // placed in semaphoreWasCreated.
            //
            sem = new Semaphore(3, 3, semaphoreName, 
                out semaphoreWasCreated, semSec);

            // If the named system semaphore was created, it can be
            // used by the current instance of this program, even 
            // though the current user is denied access. The current
            // program enters the semaphore. Otherwise, exit the
            // program.
            // 
            if (semaphoreWasCreated)
            {
                Console.WriteLine("Created the semaphore.");
            }
            else
            {
                Console.WriteLine("Unable to create the semaphore.");
                return;
            }
        }
        else if (unauthorized)
        {
            // Open the semaphore to read and change the access
            // control security. The access control security defined
            // above allows the current user to do this.
            //
            try
            {
                sem = Semaphore.OpenExisting(
                    semaphoreName, 
                    SemaphoreRights.ReadPermissions 
                        | SemaphoreRights.ChangePermissions);

                // Get the current ACL. This requires 
                // SemaphoreRights.ReadPermissions.
                SemaphoreSecurity semSec = sem.GetAccessControl();
                
                string user = Environment.UserDomainName + "\\" 
                    + Environment.UserName;

                // First, the rule that denied the current user 
                // the right to enter and release the semaphore must
                // be removed.
                SemaphoreAccessRule rule = new SemaphoreAccessRule(
                    user, 
                    SemaphoreRights.Synchronize | SemaphoreRights.Modify, 
                    AccessControlType.Deny);
                semSec.RemoveAccessRule(rule);

                // Now grant the user the correct rights.
                // 
                rule = new SemaphoreAccessRule(user, 
                     SemaphoreRights.Synchronize | SemaphoreRights.Modify, 
                     AccessControlType.Allow);
                semSec.AddAccessRule(rule);

                // Update the ACL. This requires
                // SemaphoreRights.ChangePermissions.
                sem.SetAccessControl(semSec);

                Console.WriteLine("Updated semaphore security.");

                // Open the semaphore with (SemaphoreRights.Synchronize 
                // | SemaphoreRights.Modify), the rights required to
                // enter and release the semaphore.
                //
                sem = Semaphore.OpenExisting(semaphoreName);
            }
            catch(UnauthorizedAccessException ex)
            {
                Console.WriteLine("Unable to change permissions: {0}", ex.Message);
                return;
            }
        }

        // Enter the semaphore, and hold it until the program
        // exits.
        //
        try
        {
            sem.WaitOne();
            Console.WriteLine("Entered the semaphore.");
            Console.WriteLine("Press the Enter key to exit.");
            Console.ReadLine();
            sem.Release();
        }
        catch(UnauthorizedAccessException ex)
        {
            Console.WriteLine("Unauthorized access: {0}", ex.Message);
        }
    }
}
Imports System.Threading
Imports System.Security.AccessControl

Friend Class Example

    <MTAThread> _
    Friend Shared Sub Main()
        Const semaphoreName As String = "SemaphoreExample5"

        Dim sem As Semaphore = Nothing
        Dim doesNotExist as Boolean = False
        Dim unauthorized As Boolean = False

        ' Attempt to open the named semaphore.
        Try
            ' Open the semaphore with (SemaphoreRights.Synchronize
            ' Or SemaphoreRights.Modify), to enter and release the
            ' named semaphore.
            '
            sem = Semaphore.OpenExisting(semaphoreName)
        Catch ex As WaitHandleCannotBeOpenedException
            Console.WriteLine("Semaphore does not exist.")
            doesNotExist = True
        Catch ex As UnauthorizedAccessException
            Console.WriteLine("Unauthorized access: {0}", ex.Message)
            unauthorized = True
        End Try

        ' There are three cases: (1) The semaphore does not exist.
        ' (2) The semaphore exists, but the current user doesn't 
        ' have access. (3) The semaphore exists and the user has
        ' access.
        '
        If doesNotExist Then
            ' The semaphore does not exist, so create it.
            '
            ' The value of this variable is set by the semaphore
            ' constructor. It is True if the named system semaphore was
            ' created, and False if the named semaphore already existed.
            '
            Dim semaphoreWasCreated As Boolean

            ' Create an access control list (ACL) that denies the
            ' current user the right to enter or release the 
            ' semaphore, but allows the right to read and change
            ' security information for the semaphore.
            '
            Dim user As String = Environment.UserDomainName _ 
                & "\" & Environment.UserName
            Dim semSec As New SemaphoreSecurity()

            Dim rule As New SemaphoreAccessRule(user, _
                SemaphoreRights.Synchronize Or SemaphoreRights.Modify, _
                AccessControlType.Deny)
            semSec.AddAccessRule(rule)

            rule = New SemaphoreAccessRule(user, _
                SemaphoreRights.ReadPermissions Or _
                SemaphoreRights.ChangePermissions, _
                AccessControlType.Allow)
            semSec.AddAccessRule(rule)

            ' Create a Semaphore object that represents the system
            ' semaphore named by the constant 'semaphoreName', with
            ' maximum count three, initial count three, and the
            ' specified security access. The Boolean value that 
            ' indicates creation of the underlying system object is
            ' placed in semaphoreWasCreated.
            '
            sem = New Semaphore(3, 3, semaphoreName, _
                semaphoreWasCreated, semSec)

            ' If the named system semaphore was created, it can be
            ' used by the current instance of this program, even 
            ' though the current user is denied access. The current
            ' program enters the semaphore. Otherwise, exit the
            ' program.
            ' 
            If semaphoreWasCreated Then
                Console.WriteLine("Created the semaphore.")
            Else
                Console.WriteLine("Unable to create the semaphore.")
                Return
            End If

        ElseIf unauthorized Then

            ' Open the semaphore to read and change the access
            ' control security. The access control security defined
            ' above allows the current user to do this.
            '
            Try
                sem = Semaphore.OpenExisting(semaphoreName, _
                    SemaphoreRights.ReadPermissions Or _
                    SemaphoreRights.ChangePermissions)

                ' Get the current ACL. This requires 
                ' SemaphoreRights.ReadPermissions.
                Dim semSec As SemaphoreSecurity = sem.GetAccessControl()
                
                Dim user As String = Environment.UserDomainName _ 
                    & "\" & Environment.UserName

                ' First, the rule that denied the current user 
                ' the right to enter and release the semaphore must
                ' be removed.
                Dim rule As New SemaphoreAccessRule(user, _
                    SemaphoreRights.Synchronize Or SemaphoreRights.Modify, _
                    AccessControlType.Deny)
                semSec.RemoveAccessRule(rule)

                ' Now grant the user the correct rights.
                ' 
                rule = New SemaphoreAccessRule(user, _
                    SemaphoreRights.Synchronize Or SemaphoreRights.Modify, _
                    AccessControlType.Allow)
                semSec.AddAccessRule(rule)

                ' Update the ACL. This requires
                ' SemaphoreRights.ChangePermissions.
                sem.SetAccessControl(semSec)

                Console.WriteLine("Updated semaphore security.")

                ' Open the semaphore with (SemaphoreRights.Synchronize 
                ' Or SemaphoreRights.Modify), the rights required to
                ' enter and release the semaphore.
                '
                sem = Semaphore.OpenExisting(semaphoreName)

            Catch ex As UnauthorizedAccessException
                Console.WriteLine("Unable to change permissions: {0}", _
                    ex.Message)
                Return
            End Try

        End If

        ' Enter the semaphore, and hold it until the program
        ' exits.
        '
        Try
            sem.WaitOne()
            Console.WriteLine("Entered the semaphore.")
            Console.WriteLine("Press the Enter key to exit.")
            Console.ReadLine()
            sem.Release()
        Catch ex As UnauthorizedAccessException
            Console.WriteLine("Unauthorized access: {0}", _
                ex.Message)
        End Try
    End Sub 
End Class

Opmerkingen

Gebruik deze constructor om de beveiliging van toegangsbeheer toe te passen op een benoemd systeemsemafore wanneer deze wordt gemaakt, zodat andere code de controle over de semafore kan overnemen.

De name naamruimte kan worden voorafgegaan door Global\ of Local\ om een naamruimte op te geven. Wanneer de Global naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen op het systeem. Wanneer de Local naamruimte is opgegeven, wat ook de standaardwaarde is wanneer er geen naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen in dezelfde sessie. Op Windows is een sessie een aanmeldingssessie en worden services meestal uitgevoerd in een andere niet-interactieve sessie. Op Unix-achtige besturingssystemen heeft elke shell een eigen sessie. Sessie-lokale synchronisatieobjecten zijn mogelijk geschikt voor synchronisatie tussen processen met een bovenliggende/onderliggende relatie, waar ze allemaal in dezelfde sessie worden uitgevoerd. Zie Objectnamen voor meer informatie over de namen van synchronisatieobjecten in Windows.

Als er een name is opgegeven en er al een synchronisatieobject van het aangevraagde type bestaat in de naamruimte, wordt het bestaande synchronisatieobject gebruikt. Als er al een synchronisatieobject van een ander type bestaat in de naamruimte, wordt er een WaitHandleCannotBeOpenedException gegenereerd. Anders wordt er een nieuw synchronisatieobject gemaakt.

Met deze constructor wordt een Semaphore object geïnitialiseerd dat een benoemd systeemsemafore vertegenwoordigt. U kunt meerdere Semaphore objecten maken die dezelfde benoemde systeememafore vertegenwoordigen.

Als de benoemde systeememafore niet bestaat, wordt deze gemaakt met de opgegeven beveiliging voor toegangsbeheer. Als de benoemde semaphore bestaat, wordt de opgegeven beveiliging voor toegangsbeheer genegeerd.

Note

De aanroeper heeft volledige controle over het zojuist gemaakte Semaphore object, zelfs als semaphoreSecurity bepaalde toegangsrechten voor de huidige gebruiker worden geweigerd of mislukt. Als de huidige gebruiker echter probeert een ander Semaphore-object te verkrijgen om dezelfde benoemde semafore weer te geven, wordt er een constructor of de methode OpenExisting toegepast Windows beveiliging voor toegangsbeheer wordt toegepast.

Als de benoemde systeememafore niet bestaat, wordt deze gemaakt met het aanvankelijke aantal en het maximumaantal dat is opgegeven door initialCount en maximumCount. Als de benoemde systeememafore al bestaat initialCount en maximumCount niet wordt gebruikt, hoewel ongeldige waarden nog steeds uitzonderingen veroorzaken. Gebruik de createdNew parameter om te bepalen of de systeemsemafore is gemaakt door deze constructor.

Als initialCount dit kleiner is dan maximumCounten createdNew is, is truehet effect hetzelfde als als de huidige thread (WaitOneminmaximumCount) tijden had aangeroepen initialCount .

Als u opgeeft null of een lege tekenreeks voor name, wordt er een lokale semafore gemaakt, alsof u de Semaphore(Int32, Int32) constructor-overbelasting had genoemd. In dit geval createdNew is dat altijd true.

Omdat benoemde semaphores zichtbaar zijn in het hele besturingssysteem, kunnen ze worden gebruikt om het resourcegebruik te coördineren over procesgrenzen.

Caution

Standaard is een benoemde semafore niet beperkt tot de gebruiker die deze heeft gemaakt. Andere gebruikers kunnen mogelijk deemafore openen en gebruiken, waaronder het verstoren van de semafore door de semafor meerdere keren te verkrijgen en niet vrij te geven. Als u de toegang tot specifieke gebruikers wilt beperken, kunt u een SemaphoreSecurity wachtwoord doorgeven bij het maken van de benoemde semafore. Vermijd het gebruik van benoemde semaforen zonder toegangsbeperkingen voor systemen die mogelijk niet-vertrouwde gebruikers code laten uitvoeren.

Zie ook

Van toepassing op

Semaphore(Int32, Int32, String, NamedWaitHandleOptions, Boolean)

Bron:
Semaphore.cs
Bron:
Semaphore.cs

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, optioneel de naam van een systeemmaforeobject en opties opgeven om toegang tot gebruikersbereik en sessiebereik in te stellen en een variabele op te geven die een waarde ontvangt die aangeeft of er een nieuwe systeemsemafore is gemaakt.

public:
 Semaphore(int initialCount, int maximumCount, System::String ^ name, System::Threading::NamedWaitHandleOptions options, [Runtime::InteropServices::Out] bool % createdNew);
public Semaphore(int initialCount, int maximumCount, string? name, System.Threading.NamedWaitHandleOptions options, out bool createdNew);
new System.Threading.Semaphore : int * int * string * System.Threading.NamedWaitHandleOptions * bool -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer, name As String, options As NamedWaitHandleOptions, ByRef createdNew As Boolean)

Parameters

initialCount
Int32

Het eerste aantal aanvragen voor de semaphore dat gelijktijdig kan worden voldaan.

maximumCount
Int32

Het maximum aantal aanvragen voor de semaphore dat gelijktijdig kan worden voldaan.

name
String

De naam, als het synchronisatieobject moet worden gedeeld met andere processen; anders of null een lege tekenreeks. De naam is hoofdlettergevoelig.

options
NamedWaitHandleOptions

De bereikopties voor de benoemde semaphore. De standaardinstelling is alleen toegankelijk voor de huidige gebruiker en de huidige sessie. De opgegeven opties kunnen van invloed zijn op de naamruimte voor de naam en toegang tot het onderliggende semaphore-object.

createdNew
Boolean

Wanneer deze methode retourneert, bevat dit true als er een lokale semafore is gemaakt (dat namenull wil wel of een lege tekenreeks) of als de opgegeven benoemde systeemsemafore is gemaakt; bevat false als de opgegeven benoemde systeememafore al bestond. Deze parameter wordt niet-geïnitialiseerd doorgegeven.

Uitzonderingen

initialCount is groter dan maximumCount.

– of –

initialCount is kleiner dan 0.

name is ongeldig. Dit kan om verschillende redenen zijn, waaronder enkele beperkingen die mogelijk door het besturingssysteem worden geplaatst, zoals een onbekend voorvoegsel of ongeldige tekens. Houd er rekening mee dat de naam en algemene voorvoegsels 'Global\' en 'Local\' hoofdlettergevoelig zijn.

– of –

Er is een andere fout opgetreden. De HResult eigenschap biedt mogelijk meer informatie.

alleen Windows: name een onbekende naamruimte opgegeven. Zie Objectnamen voor meer informatie.

Het name is te lang. Lengtebeperkingen kunnen afhankelijk zijn van het besturingssysteem of de configuratie.

De benoemde semaphore bestaat en heeft beveiliging voor toegangsbeheer en de gebruiker heeft geen FullControl.

Een synchronisatieobject met de opgegeven name kan niet worden gemaakt. Een synchronisatieobject van een ander type kan dezelfde naam hebben.

– of –

Er bestaat een object met de opgegeven waarde, maar de opgegeven nameoptions objecten zijn niet compatibel met de opties van het bestaande object.

Opmerkingen

Als er een name is opgegeven en er al een synchronisatieobject van het aangevraagde type bestaat in de naamruimte, wordt het bestaande synchronisatieobject gebruikt, tenzij options de toegang beperkt is tot de huidige gebruiker en het synchronisatieobject niet compatibel is met het object, in welk geval er een WaitHandleCannotBeOpenedException wordt gegenereerd. Als er al een synchronisatieobject van een ander type in de naamruimte bestaat, wordt er ook een WaitHandleCannotBeOpenedException gegenereerd. Anders wordt er een nieuw synchronisatieobject gemaakt.

Met deze constructor wordt een Semaphore object geïnitialiseerd dat een benoemd systeemsemafore vertegenwoordigt. U kunt meerdere Semaphore objecten maken die dezelfde benoemde systeememafore vertegenwoordigen.

Als de benoemde systeememafore niet bestaat, wordt deze gemaakt met het aanvankelijke aantal en het maximumaantal dat is opgegeven door initialCount en maximumCount. Als de benoemde systeememafore al bestaat initialCount en maximumCount niet wordt gebruikt, hoewel ongeldige waarden nog steeds uitzonderingen veroorzaken. Gebruik de createdNew parameter om te bepalen of de systeemsemafore is gemaakt door deze constructor.

Als initialCount dit kleiner is dan maximumCounten createdNew is, is truehet effect hetzelfde als als de huidige thread (WaitOneminmaximumCount) tijden had aangeroepen initialCount .

Als u opgeeft null of een lege tekenreeks voor name, wordt er een lokale semafore gemaakt, alsof u de Semaphore(Int32, Int32) constructor-overbelasting had genoemd. In dit geval createdNew is dat altijd true.

Omdat benoemde semaphores zichtbaar zijn in het hele besturingssysteem, kunnen ze worden gebruikt om het resourcegebruik te coördineren over procesgrenzen.

Op Windows kan options worden opgegeven om op te geven of de benoemde semaphore alleen toegankelijk is voor de huidige gebruiker of voor alle gebruikers. Hiermee kunt u ook opgeven of de benoemde semaphore alleen toegankelijk is voor processen in de huidige sessie of voor alle sessies. Zie NamedWaitHandleOptions voor meer informatie.

Caution

Op Unix-besturingssystemen heeft de options parameter geen effect omdat benoemde semaphores niet worden ondersteund.

Zie ook

Van toepassing op