SzkoleniaRiskoff/src/Libraries/Nop.Core/ComponentModel/ReaderWriteLockDisposable.cs

74 lines
2.4 KiB
C#
Raw Normal View History

2024-08-21 10:09:17 -04:00
using System;
using System.Threading;
2024-08-21 06:17:23 -04:00
2024-08-21 10:09:17 -04:00
namespace Nop.Core.ComponentModel
2024-08-21 06:17:23 -04:00
{
/// <summary>
2024-08-21 10:09:17 -04:00
/// Provides a convenience methodology for implementing locked access to resources.
2024-08-21 06:17:23 -04:00
/// </summary>
2024-08-21 10:09:17 -04:00
/// <remarks>
/// Intended as an infrastructure class.
/// </remarks>
public class ReaderWriteLockDisposable : IDisposable
2024-08-21 06:17:23 -04:00
{
2024-08-21 10:09:17 -04:00
private bool _disposed = false;
private readonly ReaderWriterLockSlim _rwLock;
private readonly ReaderWriteLockType _readerWriteLockType;
2024-08-21 06:17:23 -04:00
2024-08-21 10:09:17 -04:00
/// <summary>
/// Initializes a new instance of the <see cref="ReaderWriteLockDisposable"/> class.
/// </summary>
/// <param name="rwLock">The readerswriter lock</param>
/// <param name="readerWriteLockType">Lock type</param>
public ReaderWriteLockDisposable(ReaderWriterLockSlim rwLock, ReaderWriteLockType readerWriteLockType = ReaderWriteLockType.Write)
2024-08-21 06:17:23 -04:00
{
2024-08-21 10:09:17 -04:00
_rwLock = rwLock;
_readerWriteLockType = readerWriteLockType;
2024-08-21 06:17:23 -04:00
switch (_readerWriteLockType)
{
case ReaderWriteLockType.Read:
2024-08-21 10:09:17 -04:00
_rwLock.EnterReadLock();
2024-08-21 06:17:23 -04:00
break;
case ReaderWriteLockType.Write:
2024-08-21 10:09:17 -04:00
_rwLock.EnterWriteLock();
2024-08-21 06:17:23 -04:00
break;
case ReaderWriteLockType.UpgradeableRead:
2024-08-21 10:09:17 -04:00
_rwLock.EnterUpgradeableReadLock();
2024-08-21 06:17:23 -04:00
break;
}
}
2024-08-21 10:09:17 -04:00
// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
2024-08-21 06:17:23 -04:00
2024-08-21 10:09:17 -04:00
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (_disposed)
return;
2024-08-21 06:17:23 -04:00
2024-08-21 10:09:17 -04:00
if (disposing)
{
switch (_readerWriteLockType)
{
case ReaderWriteLockType.Read:
_rwLock.ExitReadLock();
break;
case ReaderWriteLockType.Write:
_rwLock.ExitWriteLock();
break;
case ReaderWriteLockType.UpgradeableRead:
_rwLock.ExitUpgradeableReadLock();
break;
}
}
_disposed = true;
}
2024-08-21 06:17:23 -04:00
}
2024-08-21 10:09:17 -04:00
}