我有一些问题ReaderWriterLockSlim
。我不明白这是多么神奇。
我的代码:
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>
}
当我在<1>处输入写锁时,在调试器中我可以看到_indexLock.IsWriteLockHeld
是true
,但是当执行到<2>的步骤时,我看到了_indexLock.IsWriteLockHeld
isfalse
并_indexLock.ExitWriteLock
抛出一条异常SynchronizationLockException
,消息为“写锁被释放而不被持有”。我做错了什么?
ReaderWriterLockSlim
是线程仿射锁定类型,因此通常不能与async
和一起使用await
。
你应该使用SemaphoreSlim
带WaitAsync
,或者(如果你真的需要一个读/写器锁),用我AsyncReaderWriterLock
从AsyncEx或斯蒂芬Toub的AsyncReaderWriterLock
。
说这取决于平台还不是正确的吗?OP发布的代码没有提及它是WPF还是控制台应用程序。在控制台应用程序中,它不起作用,因为那里不
SynchronizationContext
存在。该代码在WPF应用中正常运行。stackoverflow.com/questions/15882710/…@DonBox:不;正如我在对该问题的回答中所指出的那样,即使您在同一线程上继续执行操作,也仍然可以在“持有”该锁的同时运行任意代码。
哦,老兄,我以为我做对了。您能解释一下“任意代码”是什么意思吗?您的意思是,即使在WPF中,代码也无法正常工作?在那里拿着锁怎么了?在回答中,“通常”“通常无法使用”是什么意思?谢谢!
@DonBox:您一直在评论中提出很多问题。我认为您可以从提出自己的问题中受益。
好的,很有道理,这里是stackoverflow.com/questions/44036160/…