33 lines
708 B
C#
33 lines
708 B
C#
using System;
|
|
using System.Threading;
|
|
using JD.Kernel.Classes;
|
|
|
|
namespace JD.Threading
|
|
{
|
|
public class SafeAccessor<T> where T : class
|
|
{
|
|
protected readonly T m_unsafeObject;
|
|
|
|
public SafeAccessor(T unsafeObject)
|
|
{
|
|
m_unsafeObject = unsafeObject;
|
|
}
|
|
|
|
public IDisposable Use(out T unsafeObject)
|
|
{
|
|
Monitor.Enter(m_unsafeObject);
|
|
|
|
unsafeObject = m_unsafeObject;
|
|
|
|
try
|
|
{
|
|
return new DisposableHelper(() => Monitor.Exit(m_unsafeObject));
|
|
}
|
|
catch
|
|
{
|
|
Monitor.Exit(m_unsafeObject);
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
}
|