Lock.cs 729 B

1234567891011121314151617181920212223242526272829303132
  1. using System;
  2. using System.Threading;
  3. namespace WinSCP
  4. {
  5. public class Lock
  6. {
  7. public void Enter()
  8. {
  9. Monitor.Enter(_lock);
  10. if (_locked)
  11. {
  12. Monitor.Exit(_lock);
  13. throw new InvalidOperationException("Recursive calls not allowed");
  14. }
  15. _locked = true;
  16. }
  17. public void Exit()
  18. {
  19. if (!_locked)
  20. {
  21. throw new InvalidOperationException("Not locked");
  22. }
  23. _locked = false;
  24. Monitor.Exit(_lock);
  25. }
  26. private readonly object _lock = new object();
  27. private bool _locked;
  28. }
  29. }