Pergunta

Tenho uma situação em que posso ter várias instâncias de um programa em execução ao mesmo tempo e é importante que apenas uma função específica não seja executada em mais de uma dessas instâncias ao mesmo tempo.

Esta é a maneira correta de usar um mutex para evitar que isso aconteça?

lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}
Foi útil?

Solução

Você disse várias instâncias de um aplicativo, então estamos falando de dois programas.exe em execução, certo?A instrução lock não bloqueará vários programas, apenas dentro do programa.Se você quiser um verdadeiro Mutex, dê uma olhada no Sistema.Threading.Mutex objeto.

Aqui está um exemplo de uso:

bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
    try
    {
        mtx.WaitOne();

        MessageBox.Show("Click OK to release the mutex.");
    }
    finally
    {
        mtx.ReleaseMutex();
    }
}

A variávelcreateNew permitirá que você saiba se ela foi criada ou não na primeira vez.No entanto, ele apenas informa se foi criado.Se quiser adquirir o bloqueio, você precisa ligar para WaitOne e depois chamar ReleaseMutex para liberá-lo.Se você quer apenas ver se criou um Mutex, basta construí-lo.

Outras dicas

O Seeker está correto.

O conselho de Jeff Richter em Clr Via C# (p638-9) sobre bloqueio é criar um objeto privado especificamente com a finalidade de ser bloqueado.

private Object _lock = new Object();

// usage
lock( _lock )
{
    // thread-safe code here..
}

Isso funciona porque _lock não pode ser bloqueado por nada fora da classe atual.

EDITAR:isso é aplicável a threads em execução em um único processo.A resposta de @David Mohundro está correta para bloqueio entre processos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top