Warm tip: This article is reproduced from serverfault.com, please click

c#-ReaderWriterLockSlim和async \ await

(c# - ReaderWriterLockSlim and async\await)

发布于 2013-10-29 13:20:14

我有一些问题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.IsWriteLockHeldtrue,但是当执行到<2>的步骤时,我看到了_indexLock.IsWriteLockHeldisfalse_indexLock.ExitWriteLock抛出一条异常SynchronizationLockException,消息为“写锁被释放而不被持有”。我做错了什么?

Questioner
l0nley
Viewed
0
8,547 2020-06-08 10:51:09

ReaderWriterLockSlim是线程仿射锁定类型,因此通常不能与async一起使用await

你应该使用SemaphoreSlimWaitAsync,或者(如果你真的需要一个读/写器锁),用我AsyncReaderWriterLock从AsyncEx斯蒂芬Toub的AsyncReaderWriterLock