gpt4 book ai didi

c# - IOException 被 ReaderWriteLockSlim 抛出?

转载 作者:行者123 更新时间:2023-11-30 18:04:22 29 4
gpt4 key购买 nike

我有一个由多个线程访问的静态类,并在各种方法中使用 ReaderWriterLockSlim 来维护线程安全。这在大多数情况下都工作正常,但是间歇性地我看到一个 IOException handle is invalid 错误被一个特定的方法抛出,如下面的堆栈跟踪所示。这让我非常困惑,因为我什至不知道 System.IO 涉及 ReaderWriterLock。

对于理解错误可能来自何处的任何帮助,我们将不胜感激。

堆栈跟踪:

System.IO.IOException: The handle is invalid.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.Threading.EventWaitHandle.Reset()
at System.Threading.ReaderWriterLockSlim.WaitOnEvent(EventWaitHandle waitEvent, UInt32& numWaiters, Int32 millisecondsTimeout)
at System.Threading.ReaderWriterLockSlim.TryEnterUpgradeableReadLock(Int32 millisecondsTimeout)

代码:

class Class1
{
private static ReaderWriterLockSlim readwriteLock = new ReaderWriterLockSlim();
private const int readwriterlocktimeoutms = 5000;

private static void myMethod(int ID)
{
bool IsTaken = false;
bool isWriteLockTaken = false;

if (!readwriteLock.TryEnterUpgradeableReadLock(readwriterlocktimeoutms))
{
throw new Exception("SafeGetSuItem: Error acquiring read lock");
}
else { IsTaken = true; }
try
{
// do some work which may require upgrading to a write lock depending on particular conditions
}
finally
{
if (IsTaken)
{
try
{
readwriteLock.ExitUpgradeableReadLock();
IsTaken = false;
}
catch
{
throw;
}
}
}
}

}


enter code here

bool IsWriteTaken = false;
try
{
if (!readerwriterlock.TryEnterWriteLock(readerwriterlocktimeout))
{
// log the error
}
else
{
IsWriteTaken = true;
}

if (IsWriteTaken)
{
// do some work
}
}
finally
{
if (IsWriteTaken)
{
try
{
readerwriterlock.ExitWriteLock();
}
catch
{
throw;
}
}
}

最佳答案

这有点奇怪。您可能 偶然发现了WaitHandle 类中的错误。我通过 Reflector 将其分开,这就是我所看到的。

  • ReaderWriterLockSlim 上调用Dispose 将在堆栈跟踪中列出的EventWaitHandle 上调用Close。<
  • EventWaitHandle 上调用 Close 会尝试处理底层 SafeHandle
  • EventWaitHandle 上调用 Reset 从 kernel32.dll 直接调用 ResetEvent Win32 API 并传入 SafeHandle.
  • 我发现没有任何同步机制可以防止处理 SafeHandle 和让 Win32 API 使用该实例之间的竞争。

您是否在 TryEnterUpgradeableReadLock 可能正在执行时从另一个线程在 ReaderWriterLockSlim 实例上调用 Dispose?这对我来说似乎是最有可能发生的情况。实际上,这是我看到的唯一会导致抛出 IOException 的情况。

在我看来,仅基于我对 BCL 代码的粗略分析,IOException 可能 是设计使然,但它会产生更多感觉微软是否可以以某种方式生成 ObjectDisposedException 而不是我为重现该问题所做的每一次其他尝试都会发生这种情况。我会继续将此报告给 Microsoft。

关于c# - IOException 被 ReaderWriteLockSlim 抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6218288/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com