Mam pewne problemy z ReaderWriterLockSlim
. Nie rozumiem, jak działa magia.ReaderWriterLockSlim i async czekajĘ ...
Mój kod:
private async Task LoadIndex()
{
if (!File.Exists(FileName + ".index.txt"))
{
return;
}
_indexLock.EnterWriteLock();// <1>
_index.Clear();
using (TextReader index = File.OpenText(FileName + ".index.txt"))
{
string s;
while (null != (s = await index.ReadLineAsync()))
{
var ss = s.Split(':');
_index.Add(ss[0], Convert.ToInt64(ss[1]));
}
}
_indexLock.ExitWriteLock();<2>
}
Kiedy wprowadzić blokadę zapisu na < 1>, debugger widzę że _indexLock.IsWriteLockHeld
jest true
, ale kiedy kroki egzekucyjne do < 2> Widzę _indexLock.IsWriteLockHeld
jest false
i _indexLock.ExitWriteLock
zgłasza wyjątek SynchronizationLockException
z komunikatem "Blokada zapisu jest zwalniana bez trzymania". Co robię źle?
W jaki sposób inicjalizowane jest '_indexLock'? Czy inny wątek może zainicjować go w tym samym czasie, gdy inny wątek jest w 'LoadIndex()'? –
Może inny wątek, który ma dostęp do _indexLock, ponownie go inicjuje ... na pewno nie mógł zostać zwolniony przez inny wątek, ale może być ponownie zainicjowany na nowej instancji razem ... –
Nie wymaga wątku, aby uzyskać _indexLock do nadpisania. –