Domanda

Sto cercando di semplificare le cose. Ecco il mio codice:

    If Threading.Monitor.TryEnter(syncRoot) Then
        Try
            'do something
        Finally
            Threading.Monitor.Exit(syncRoot)
        End Try
    Else
        'do something else
    End If

Questo è anche peggio di ReaderWriterLock in termini di rumore. Posso usare C # o VB, quindi le risposte che faranno domanda saranno benvenute.

È stato utile?

Soluzione

Usa un delegato?

per es.

public bool TryEnter(object lockObject, Action work) 
{
    if (Monitor.TryEnter(lockObject)) 
    {
       try 
       {
          work();
       }
       finally 
       {
           Monitor.Exit(lockObject);
       }        
       return true;
     }

     return false;
}

Altri suggerimenti

Questo è molto simile al tuo ultimo post e mi aspetterei una risposta simile. L'unica differenza significativa è che potresti restituire " null " dal tuo metodo se il timeout fallisce, quindi il " Dispose () " non viene chiamato e puoi facilmente verificare il valore:

using(var token = GetLock(syncLock, timeout)) {
  if(token != null) { ... }
}

L'unico vero problema è che non devi necessariamente aggiungere un metodo di estensione a " oggetto " (o anche " T dove T: class ") ...

Jon Skeet ha esaminato questo aspetto in passato - vale la pena dare un'occhiata .

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