ho il seguente scenario:migliorata consiglio di bloccaggio Discussione necessaria
Sto cercando di bloccare un filo in atto, se le discussioni che 'personalizzato' id corrisponde a quello che è già entrato nella sezione bloccata al largo di codice, ma non se l'ID è diverso.
ho creato un po 'di codice di esempio per spiegare il comportamento che voglio
class A
{
private static Dictionary<int, object> _idLocks = new Dictionary<int, object>();
private static readonly object _DictionaryLock = new object();
private int _id;
private void A (int id)
{
_id = id;
}
private object getObject()
{
lock (_DictionaryLock)
{
if (!_idLocks.ContainsKey(_id))
_idLocks.Add(_id, new object());
}
lock (_idLocks[_id])
{
if (TestObject.Exists(_id))
return TestObject(_id);
else
return CreateTestObject(_id);
}
}
}
Ora questo funziona al 100% per quello che ho prolungato, dove id esempio 1 non verifica per vedere se il suo oggetto è stato creato mentre un altro thread con ID 1 è già occupato per la creazione di quell'oggetto.
Ma avere due blocchi e un dizionario statico non sembra un modo corretto di farlo, quindi spero che qualcuno possa mostrarmi un metodo migliorato per fermare un thread dall'accesso al codice solo se quel thread è stato creato con il lo stesso ID di quello già occupato nell'esecuzione del codice nella sezione bloccata.
Stavo guardando la classe ReaderWriterLockSlim ma per me non aveva senso essere usato perché non voglio che l'oggetto TestObject (id) venga letto mentre è ancora in fase di creazione.
Non mi interessa il blocco del thread dall'accesso a un dizionario. Quello che sto cercando di evitare a tutti i costi è l'_id in cui quel thread viene eseguito non deve essere usato all'interno di CreateTestObject(_id)
mentre ce n'è già uno occupato, perché i file vengono creati e cancellati con quell'id che genera eccezioni se due thread stanno provando per accedere agli stessi file
Quale è risolvibile con un semplice blocco, ma in questo caso voglio ancora un thread il cui _id non è attualmente in esecuzione all'interno del metodo CreateTestObject(_id)
per poter inserire il codice all'interno del blocco.
Questo è tutto perché ciò che accade in CreateTestObject richiede tempo e le prestazioni subiranno un impatto se un thread è in attesa di accedervi.
È possibile eseguire un blocco sull'intero dizionario '_idLocks' anziché sui 2 blocchi? Sono abbastanza nuovo per le serrature quindi non sono sicuro di cosa si possa usare come oggetto di blocco o meno. –