Um semáforo é usado para limitar o número de threads que têm acesso a um recurso compartilhado ao mesmo tempo. Em outras palavras, um semáforo permite que você implemente o bloqueio não exclusivo e, portanto, limite a simultaneidade. Você pode pensar em um semáforo como uma forma não exclusiva de um mutex. No .NET, usamos a classe System.Threading.Semaphore para trabalhar com semáforos.
Crie um mutex em C#
Vamos criar um objeto mutex no .web. Observe que usamos o método wagone em uma instância da classe Mutex para bloquear um recurso e o método RELEASEMUTEX para desbloqueá -lo.
Mutex mutexObject = new Mutex(false, "Demo");
attempt
{
if (!mutexObject.WaitOne(TimeSpan.FromSeconds(10), false))
{
Console.WriteLine("Quitting for now as one other occasion is in execution...");
return;
}
}
lastly
{
mutexObject.ReleaseMutex();
}
Vamos agora implementar um exemplo de código da vida actual que usa um mutex para sincronizar o acesso a um recurso compartilhado. A lista de código a seguir demonstra como você pode usar um objeto Mutex em C# para sincronizar o acesso a uma seção crítica que grava dados em um arquivo de texto.
public static class FileLogger
{
personal const string fileName = @"D:ProjectsMyLog.txt";
public static void WriteLog(string textual content)
{
utilizing var mutex = new Mutex(initiallyOwned: false, "Worldlog");
attempt
{
mutex.WaitOne(1000);
File.AppendAllText(fileName, textual content);
}
catch (AbandonedMutexException)
{
mutex.ReleaseMutex();
mutex.WaitOne(1000);
File.AppendAllText(fileName, textual content);
}
lastly
{
mutex.ReleaseMutex();
}
}
}
Na classe FileLogger mostrada acima, é feita uma tentativa de adquirir um mutex bloqueando o thread atual por 1000 milissegundos. Se o mutex for adquirido, o texto passado para o método ApndendAltText como parâmetro será gravado em um arquivo de texto. O bloco finalmente libera o mutex fazendo uma chamada para o método RELEASEMUTEX.