Domanda

In .Net4, Monitor.Enter (Object) è contrassegnato come obsoleto:

[ObsoleteAttribute("This method does not allow its caller to reliably release the lock.  Please use an overload with a lockTaken argument instead.")]
public static void Enter(
    Object obj
)

E c'è un nuovo metodo Monitor.Enter ( lockObject, acquisitoLock) con questo utilizzo:

bool acquiredLock = false;

try
{
    Monitor.Enter(lockObject, ref acquiredLock);

    // Code that accesses resources that are protected by the lock.

}
finally
{
    if (acquiredLock)
    {
        Monitor.Exit(lockObject);
    }
}

Lo facevo in questo modo:

Monitor.Enter(lockObject);
try
{

    // Code that accesses resources that are protected by the lock.
}
finally
{
    Monitor.Exit(lockObject);
}

È sbagliato? Perché ? Forse con un interruzione dopo l'entrata ma prima del tentativo?
Come ha chiesto Eamon Nerbonne: cosa succede se c'è un'eccezione asincrona nell'ultimo diritto prima di monitor.exit?

Risposta: ThreadAbortException

  

Quando viene sollevata questa eccezione, il   il runtime esegue finalmente tutto   blocchi prima di terminare il thread.

È stato utile?

Soluzione

Come suggerito proprio alla fine della domanda, il problema è che eccezione asincrona potrebbe essere generata dopo la chiamata a Monitor.Enter ma prima di inserire il blocco try .

Il nuovo modo di fare le cose assicura che qualunque cosa accada, premi il blocco finalmente e sarai in grado di rilasciare il blocco se lo hai acquisito. (Non puoi acquisirlo se Monitor.Enter genera un'eccezione, per esempio.)

IIRC, questo è il nuovo comportamento della parola chiave lock quando si sceglie come target .NET 4.0.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top