using System; using System.Threading; namespace AnotherReplayReader.Utils { internal class Lock : IDisposable { public readonly object LockObject; private bool _disposed = false; public Lock(object lockObject) { LockObject = lockObject; Monitor.Enter(LockObject); } public void Dispose() { if (!_disposed) { Monitor.Exit(LockObject); _disposed = true; } } public static T Run(object @lock, Func action) { using var locker = new Lock(@lock); return action(); } } }