Ler em inglês

Compartilhar via


AbandonedMutexException Classe

Definição

A exceção gerada quando um thread adquire um objeto Mutex que outro thread abandonou ao ser fechado sem liberá-lo.

public class AbandonedMutexException : Exception
public class AbandonedMutexException : SystemException
[System.Runtime.InteropServices.ComVisible(false)]
[System.Serializable]
public class AbandonedMutexException : SystemException
Herança
AbandonedMutexException
Herança
AbandonedMutexException
Atributos

Exemplos

O exemplo de código a seguir executa um thread que abandona cinco mutexes, demonstrando seus efeitos sobre o método WaitAnye WaitAll os WaitOnemétodos. O valor da MutexIndex propriedade é exibido para a WaitAny chamada.

Observação

A chamada para o WaitAny método é interrompida por um dos mutexes abandonados. O outro mutex abandonado ainda pode fazer com que um AbandonedMutexException seja gerado por métodos de espera subsequentes.


using System;
using System.Threading;

public class Example
{
    private static ManualResetEvent _dummy = new ManualResetEvent(false);

    private static Mutex _orphan1 = new Mutex();
    private static Mutex _orphan2 = new Mutex();
    private static Mutex _orphan3 = new Mutex();
    private static Mutex _orphan4 = new Mutex();
    private static Mutex _orphan5 = new Mutex();

    [MTAThread]
    public static void Main()
    {
        // Start a thread that takes all five mutexes, and then
        // ends without releasing them.
        //
        Thread t = new Thread(new ThreadStart(AbandonMutex));
        t.Start();
        // Make sure the thread is finished.
        t.Join();

        // Wait on one of the abandoned mutexes. The WaitOne returns
        // immediately, because its wait condition is satisfied by
        // the abandoned mutex, but on return it throws
        // AbandonedMutexException.
        try
        {
            _orphan1.WaitOne();
            Console.WriteLine("WaitOne succeeded.");
        }
        catch(AbandonedMutexException ex)
        {
            Console.WriteLine("Exception on return from WaitOne." +
                "\r\n\tMessage: {0}", ex.Message);
        }
        finally
        {
            // Whether or not the exception was thrown, the current
            // thread owns the mutex, and must release it.
            //
            _orphan1.ReleaseMutex();
        }

        // Create an array of wait handles, consisting of one
        // ManualResetEvent and two mutexes, using two more of the
        // abandoned mutexes.
        WaitHandle[] waitFor = {_dummy, _orphan2, _orphan3};

        // WaitAny returns when any of the wait handles in the 
        // array is signaled, so either of the two abandoned mutexes
        // satisfy its wait condition. On returning from the wait,
        // WaitAny throws AbandonedMutexException. The MutexIndex
        // property returns the lower of the two index values for 
        // the abandoned mutexes. Note that the Try block and the
        // Catch block obtain the index in different ways.
        //  
        try
        {
            int index = WaitHandle.WaitAny(waitFor);
            Console.WriteLine("WaitAny succeeded.");

            // The current thread owns the mutex, and must release
            // it.
            Mutex m = waitFor[index] as Mutex;
            if (m != null) m.ReleaseMutex();
        }
        catch(AbandonedMutexException ex)
        {
            Console.WriteLine("Exception on return from WaitAny at index {0}." +
                "\r\n\tMessage: {1}", ex.MutexIndex, ex.Message);

            // Whether or not the exception was thrown, the current
            // thread owns the mutex, and must release it.
            //
            if (ex.Mutex != null) ex.Mutex.ReleaseMutex();
        }

        // Use two more of the abandoned mutexes for the WaitAll call.
        // WaitAll doesn't return until all wait handles are signaled,
        // so the ManualResetEvent must be signaled by calling Set().
        _dummy.Set();
        waitFor[1] = _orphan4;
        waitFor[2] = _orphan5;

        // The signaled event and the two abandoned mutexes satisfy
        // the wait condition for WaitAll, but on return it throws
        // AbandonedMutexException. For WaitAll, the MutexIndex
        // property is always -1 and the Mutex property is always
        // null.
        //  
        try
        {
            WaitHandle.WaitAll(waitFor);
            Console.WriteLine("WaitAll succeeded.");
        }
        catch(AbandonedMutexException ex)
        {
            Console.WriteLine("Exception on return from WaitAll. MutexIndex = {0}." +
                "\r\n\tMessage: {1}", ex.MutexIndex, ex.Message);
        }
        finally
        {
            // Whether or not the exception was thrown, the current
            // thread owns the mutexes, and must release them.
            //
            _orphan4.ReleaseMutex();
            _orphan5.ReleaseMutex();
        }
    }

    [MTAThread]
    public static void AbandonMutex()
    {
        _orphan1.WaitOne();
        _orphan2.WaitOne();
        _orphan3.WaitOne();
        _orphan4.WaitOne();
        _orphan5.WaitOne();
        // Abandon the mutexes by exiting without releasing them.
        Console.WriteLine("Thread exits without releasing the mutexes.");
    }
}

/* This code example produces the following output:

Thread exits without releasing the mutexes.
Exception on return from WaitOne.
        Message: The wait completed due to an abandoned mutex.
Exception on return from WaitAny at index 1.
        Message: The wait completed due to an abandoned mutex.
Exception on return from WaitAll. MutexIndex = -1.
        Message: The wait completed due to an abandoned mutex.
 */

Comentários

Quando um thread abandona um mutex, a exceção é lançada no próximo thread que adquire o mutex. O thread pode adquirir o mutex porque ele já estava esperando no mutex ou porque ele entra no mutex posteriormente.

Um mutex abandonado indica um erro grave de programação. Quando um thread sai sem liberar o mutex, as estruturas de dados protegidas pelo mutex podem não estar em um estado consistente. Antes da versão 2.0 do .NET Framework, esses problemas eram difíceis de descobrir porque nenhuma exceção foi gerada se uma espera fosse concluída como resultado de um mutex abandonado. Para obter mais informações, consulte a classe Mutex.

O próximo thread a solicitar a propriedade do mutex pode lidar com essa exceção e continuar, desde que a integridade das estruturas de dados possa ser verificada.

Construtores

AbandonedMutexException()

Inicializa uma nova instância da classe AbandonedMutexException com valores padrão.

AbandonedMutexException(Int32, WaitHandle)

Inicializa uma nova instância da classe AbandonedMutexException com um índice especificado para o mutex abandonado, se aplicável, e um objeto Mutex que representa o mutex.

AbandonedMutexException(SerializationInfo, StreamingContext)

Inicializa uma nova instância da classe AbandonedMutexException com dados serializados.

AbandonedMutexException(String)

Inicializa uma nova instância da classe AbandonedMutexException com uma mensagem de erro especificada.

AbandonedMutexException(String, Exception)

Inicializa uma nova instância da classe AbandonedMutexException com uma exceção interna e uma mensagem de erro especificadas.

AbandonedMutexException(String, Exception, Int32, WaitHandle)

Inicializa uma nova instância da classe AbandonedMutexException com uma mensagem de erro, a exceção interna, o índice para o mutex abandonado, se aplicável, e um objeto Mutex que representa o mutex especificados.

AbandonedMutexException(String, Int32, WaitHandle)

Inicializa uma nova instância da classe AbandonedMutexException com uma mensagem de erro, o índice do mutex abandonado, se aplicável, e o mutex abandonado especificados.

Propriedades

Data

Obtém uma coleção de pares de chave/valor que fornecem informações definidas pelo usuário adicionais sobre a exceção.

(Herdado de Exception)
HelpLink

Obtém ou define um link para o arquivo de ajuda associado a essa exceção.

(Herdado de Exception)
HResult

Obtém ou define HRESULT, um valor numérico codificado que é atribuído a uma exceção específica.

(Herdado de Exception)
InnerException

Obtém a instância Exception que causou a exceção atual.

(Herdado de Exception)
Message

Obtém uma mensagem que descreve a exceção atual.

(Herdado de Exception)
Mutex

Obtém o mutex abandonado que causou a exceção, se for conhecido.

MutexIndex

Obtém o índice do mutex abandonado que causou a exceção, se for conhecido.

Source

Obtém ou define o nome do aplicativo ou objeto que causa o erro.

(Herdado de Exception)
StackTrace

Obtém uma representação de cadeia de caracteres de quadros imediatos na pilha de chamadas.

(Herdado de Exception)
TargetSite

Obtém o método que gerou a exceção atual.

(Herdado de Exception)

Métodos

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetBaseException()

Quando substituído em uma classe derivada, retorna a Exception que é a causa raiz de uma ou mais exceções subsequentes.

(Herdado de Exception)
GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetObjectData(SerializationInfo, StreamingContext)

Quando substituído em uma classe derivada, define o SerializationInfo com informações sobre a exceção.

(Herdado de Exception)
GetType()

Obtém o tipo de runtime da instância atual.

(Herdado de Exception)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
ToString()

Cria e retorna uma representação de cadeia de caracteres da exceção atual.

(Herdado de Exception)

Eventos

SerializeObjectState
Obsoleto.

Ocorre quando uma exceção é serializada para criar um objeto de estado de exceção que contém dados serializados sobre a exceção.

(Herdado de Exception)

Aplica-se a

Confira também