{"id":308,"date":"2020-12-24T07:04:46","date_gmt":"2020-12-24T07:04:46","guid":{"rendered":"https:\/\/michaeljohnsteiner.com\/?p=308"},"modified":"2020-12-28T08:41:26","modified_gmt":"2020-12-28T08:41:26","slug":"readerwriterlockslimactionfuncwrapper-cs","status":"publish","type":"post","link":"https:\/\/michaeljohnsteiner.com\/index.php\/2020\/12\/24\/readerwriterlockslimactionfuncwrapper-cs\/","title":{"rendered":"ReaderWriterLockSlimActionFuncWrapper.cs"},"content":{"rendered":"\n<p>ReaderWriterLockSlim Wrapper See: <a href=\"https:\/\/michaeljohnsteiner.com\/index.php\/2020\/12\/28\/monitoractionfuncwrapper-cs\/\">MonitorActionFuncWrapper.cs<\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Threading;\npublic class ReaderWriterLockSlimActionFuncWrapper : ConcurrencyCheck, IDisposable\n{\n    private bool                 _deadLock;\n    private bool                 _disposed;\n    private ReaderWriterLockSlim _rwl;\n    public ReaderWriterLockSlimActionFuncWrapper(LockRecursionPolicy recursionPolicy = LockRecursionPolicy.NoRecursion)\n    {\n        _rwl = new ReaderWriterLockSlim(recursionPolicy);\n        GC.SuppressFinalize(this);\n    }\n    public void Dispose()\n    {\n        Dispose(true);\n    }\n    public void Read(Action action)\n    {\n        if (action == null)\n            throw new Exception(\"Action argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterReadLock();\n                action();\n            }\n            finally\n            {\n                _rwl.ExitReadLock();\n            }\n        else\n            action();\n    }\n    public TResult Read&lt;TResult>(Func&lt;TResult> func)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterReadLock();\n                return func();\n            }\n            finally\n            {\n                _rwl.ExitReadLock();\n            }\n        return func();\n    }\n    public (TResult1, TResult2) Read&lt;TResult1, TResult2>(Func&lt;(TResult1, TResult2)> func)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterReadLock();\n                return func();\n            }\n            finally\n            {\n                _rwl.ExitReadLock();\n            }\n        return func();\n    }\n    public (TResult1, TResult2) Read&lt;TArg, TResult1, TResult2>(Func&lt;TArg, (TResult1, TResult2)> func, TArg arg)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterReadLock();\n                return func(arg);\n            }\n            finally\n            {\n                _rwl.ExitReadLock();\n            }\n        return func(arg);\n    }\n    public TResult Read&lt;TArg, TResult>(Func&lt;TArg, TResult> func, TArg arg)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterReadLock();\n                return func(arg);\n            }\n            finally\n            {\n                _rwl.ExitReadLock();\n            }\n        return func(arg);\n    }\n    public void Read&lt;TArg>(Action&lt;TArg> action, TArg arg)\n    {\n        if (action == null)\n            throw new Exception(\"Action argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterReadLock();\n                action(arg);\n            }\n            finally\n            {\n                _rwl.ExitReadLock();\n            }\n        else\n            action(arg);\n    }\n    public void Write(Action action)\n    {\n        if (action == null)\n            throw new Exception(\"Action argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterWriteLock();\n                action();\n            }\n            finally\n            {\n                _rwl.ExitWriteLock();\n            }\n        else\n            action();\n    }\n    public TResult Write&lt;TResult>(Func&lt;TResult> func)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterWriteLock();\n                return func();\n            }\n            finally\n            {\n                _rwl.ExitWriteLock();\n            }\n        return func();\n    }\n    public (TResult1, TResult2) Write&lt;TResult1, TResult2>(Func&lt;(TResult1, TResult2)> func)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterWriteLock();\n                return func();\n            }\n            finally\n            {\n                _rwl.ExitWriteLock();\n            }\n        return func();\n    }\n    public (TResult1, TResult2) Write&lt;TArg, TResult1, TResult2>(Func&lt;TArg, (TResult1, TResult2)> func, TArg arg)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterWriteLock();\n                return func(arg);\n            }\n            finally\n            {\n                _rwl.ExitWriteLock();\n            }\n        return func(arg);\n    }\n    public TResult Write&lt;TArg, TResult>(Func&lt;TArg, TResult> func, TArg arg)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterWriteLock();\n                return func(arg);\n            }\n            finally\n            {\n                _rwl.ExitWriteLock();\n            }\n        return func(arg);\n    }\n    public void Write&lt;TArg>(Action&lt;TArg> action, TArg arg)\n    {\n        if (action == null)\n            throw new Exception(\"Action argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterWriteLock();\n                action(arg);\n            }\n            finally\n            {\n                _rwl.ExitWriteLock();\n            }\n        else\n            action(arg);\n    }\n    public void ReadUpdate(Action action)\n    {\n        if (action == null)\n            throw new Exception(\"Action argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterUpgradeableReadLock();\n                try\n                {\n                    _rwl.EnterWriteLock();\n                    action();\n                }\n                finally\n                {\n                    _rwl.ExitWriteLock();\n                }\n            }\n            finally\n            {\n                _rwl.ExitUpgradeableReadLock();\n            }\n        else\n            action();\n    }\n    public TResult ReadUpdate&lt;TResult>(Func&lt;TResult> func)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterUpgradeableReadLock();\n                try\n                {\n                    _rwl.EnterWriteLock();\n                    return func();\n                }\n                finally\n                {\n                    _rwl.ExitWriteLock();\n                }\n            }\n            finally\n            {\n                _rwl.ExitUpgradeableReadLock();\n            }\n        return func();\n    }\n    public (TResult1, TResult2) ReadUpdate&lt;TResult1, TResult2>(Func&lt;(TResult1, TResult2)> func)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterUpgradeableReadLock();\n                try\n                {\n                    _rwl.EnterWriteLock();\n                    return func();\n                }\n                finally\n                {\n                    _rwl.ExitWriteLock();\n                }\n            }\n            finally\n            {\n                _rwl.ExitUpgradeableReadLock();\n            }\n        return func();\n    }\n    public (TResult1, TResult2) ReadUpdate&lt;TArg, TResult1, TResult2>(Func&lt;TArg, (TResult1, TResult2)> func, TArg arg)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterUpgradeableReadLock();\n                try\n                {\n                    _rwl.EnterWriteLock();\n                    return func(arg);\n                }\n                finally\n                {\n                    _rwl.ExitWriteLock();\n                }\n            }\n            finally\n            {\n                _rwl.ExitUpgradeableReadLock();\n            }\n        return func(arg);\n    }\n    public TResult ReadUpdate&lt;TArg, TResult>(Func&lt;TArg, TResult> func, TArg arg)\n    {\n        if (func == null)\n            throw new Exception(\"Func argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterUpgradeableReadLock();\n                try\n                {\n                    _rwl.EnterWriteLock();\n                    return func(arg);\n                }\n                finally\n                {\n                    _rwl.ExitWriteLock();\n                }\n            }\n            finally\n            {\n                _rwl.ExitUpgradeableReadLock();\n            }\n        return func(arg);\n    }\n    public void ReadUpdate&lt;TArg>(Action&lt;TArg> action, TArg arg)\n    {\n        if (action == null)\n            throw new Exception(\"Action argument cannot be null\");\n        if (CheckState())\n            try\n            {\n                _rwl.EnterUpgradeableReadLock();\n                try\n                {\n                    _rwl.EnterWriteLock();\n                    action(arg);\n                }\n                finally\n                {\n                    _rwl.ExitWriteLock();\n                }\n            }\n            finally\n            {\n                _rwl.ExitUpgradeableReadLock();\n            }\n        else\n            action(arg);\n    }\n    ~ReaderWriterLockSlimActionFuncWrapper()\n    {\n        if (_rwl != null)\n            _rwl.Dispose();\n    }\n    protected virtual void Dispose(bool disposing)\n    {\n        if (_disposed)\n            throw new Exception(\"Already Disposed\");\n        try\n        {\n            _rwl.Dispose();\n            _disposed = true;\n            _rwl      = null;\n        }\n        catch (SynchronizationLockException) when (disposing)\n        {\n            _deadLock = true;\n        }\n        finally\n        {\n            if (!_disposed &amp;&amp; disposing)\n                GC.ReRegisterForFinalize(this);\n        }\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>ReaderWriterLockSlim Wrapper See: MonitorActionFuncWrapper.cs<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[79,151,150,158,152],"_links":{"self":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/308"}],"collection":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/comments?post=308"}],"version-history":[{"count":3,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/308\/revisions"}],"predecessor-version":[{"id":325,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/308\/revisions\/325"}],"wp:attachment":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/media?parent=308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/categories?post=308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/tags?post=308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}