Si consideri la seguente funzione che implementa l'accesso non bloccante solo a un thread.Domanda sull'utilizzo di Monitor.TryEnter e oggetto di blocco
public bool TryCancelGroup()
{
if (Monitor.TryEnter(_locked))
{
if (_locked == false)
{
_locked = true;
try
{
// do something
}
catch (Exception ex)
{
_locked = false;
}
finally
{
Monitor.Exit(_locked);
}
}
return _locked;
}
else
{
return false;
}
}
Ed ecco come viene definita la variabile _locked
.
bool _locked = false;
Ora, quando il programma raggiunge Monitor.Exit(_locked);
viene generata System.Threading.SynchronizationLockException
detto che _locked variabile non erano sincronizzati prima.
E tutto è stato lavorare prima, quando _locked variabile è stata definita come oggetto
object _locked = new object();
Quando ho cambiato in bool al fine di utilizzarlo come flag booleano ho cominciato a ricevere questa eccezione.
JaredPar ha fornito la risposta per il vostro problema. Ma la tua logica sembra essere sbagliata: se entri nel monitor con _locked = true, non uscirai mai dal monitor. – VinayC
Oh certamente sì, grazie VinayC –
Inoltre penso che di solito hai un oggetto statico come blocco. – Chris