public static T GetSynchronized <T>(IThreadSync obj, Func <T> func)
        {
            object syncRoot;

            if (obj != null && obj.IsSynchronized && (syncRoot = obj.SyncRoot) != null)
            {
                Monitor.Enter(syncRoot);
                try { return(func()); }
                finally { Monitor.Exit(syncRoot); }
            }

            return(func());
        }
        public static void RunSynchronized(IThreadSync obj, Action action)
        {
            object syncRoot;

            if (obj != null && obj.IsSynchronized && (syncRoot = obj.SyncRoot) != null)
            {
                Monitor.Enter(syncRoot);
                try { action(); }
                finally { Monitor.Exit(syncRoot); }
            }
            else
            {
                action();
            }
        }