Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Costruttore Semaphore (Int32, Int32, String)

 

Data di pubblicazione: novembre 2016

Inizializza una nuova istanza della classe Semaphore, specificando il numero di accessi iniziale e il numero massimo di accessi contemporanei, nonché indicando facoltativamente il nome di un oggetto semaforo di sistema.

Spazio dei nomi:   System.Threading
Assembly:  System (in System.dll)

public Semaphore(
	int initialCount,
	int maximumCount,
	string name
)

Parametri

initialCount
Type: System.Int32

Numero iniziale di richieste per il semaforo che possono essere concesse simultaneamente.

maximumCount
Type: System.Int32

Numero massimo di richieste per il semaforo che possono essere concesse simultaneamente.

name
Type: System.String

Nome di un oggetto semaforo di sistema denominato.

Exception Condition
ArgumentException

initialCount è maggiore di maximumCount.

-oppure-

La lunghezza di name supera i 260 caratteri.

ArgumentOutOfRangeException

maximumCount è minore di 1.

-oppure-

initialCount è minore di 0.

IOException

Errore Win32.

UnauthorizedAccessException

Il semaforo denominato esista e disponga del controllo di accesso e l'utente dispone di SemaphoreRights.FullControl.

WaitHandleCannotBeOpenedException

Non è possibile creare il semaforo denominato, probabilmente perché un handle di attesa di un tipo diverso con lo stesso nome.

Questo costruttore inizializza un Semaphore oggetto che rappresenta un semaforo di sistema denominato. È possibile creare più Semaphore gli oggetti che rappresentano lo stesso semaforo di sistema.

Se il semaforo di sistema denominato non esiste, viene creato con il numero iniziale e conteggio massimo specificati da initialCount e maximumCount. Se il semaforo di sistema denominato esiste già, initialCount e maximumCount non vengono utilizzati, anche se i valori non validi comunque causano eccezioni. Se è necessario determinare se è stato creato un semaforo di sistema denominato, utilizzare il Semaphore(Int32, Int32, String, Boolean) overload del costruttore.

System_CAPS_importantImportante

Quando si utilizza questo overload del costruttore, la procedura consigliata consiste nello specificare lo stesso numero per initialCount e maximumCount. Se initialCount è minore di maximumCount, e viene creato un semaforo di sistema denominato, l'effetto è lo stesso come se fosse stato chiamato il thread corrente WaitOne (maximumCount meno initialCount) volte. Tuttavia, con questo overload del costruttore non è possibile determinare se è stato creato un semaforo di sistema denominato.

Se si specifica null o una stringa vuota per name, viene creato un semaforo locale, come se fosse stato chiamato il Semaphore(Int32, Int32) overload del costruttore.

Poiché i semafori denominati sono visibili in tutto il sistema operativo, può essere utilizzati per coordinare l'utilizzo delle risorse attraverso i limiti dei processi.

Se si desidera verificare l'esistenza di un semaforo di sistema denominato, utilizzare il OpenExisting metodo. Il OpenExisting metodo tenta di aprire un semaforo denominato esistente e genera un'eccezione se il semaforo di sistema non esiste.

Esempio di codice seguente viene illustrato il comportamento tra più processi di un semaforo denominato. Nell'esempio viene creato un semaforo denominato con un conteggio massimo di cinque e un conteggio iniziale pari a cinque. Il programma effettua tre chiamate per il WaitOne metodo. Pertanto, se si esegue l'esempio compilato da due finestre di comando, la seconda copia si bloccherà la terza chiamata a WaitOne. Rilasciare una o più voci nella prima copia del programma per sbloccare la seconda.

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);
        }
    }
}

SecurityPermission

for calling unmanaged code to create a named system semaphore. Associated enumeration: F:System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode.

Security action: F:System.Security.Permissions.SecurityAction.LinkDemand.

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 2.0
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Windows Phone Silverlight
Disponibile da 8.0
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra: