2 changed files with 101 additions and 0 deletions
			
			
		@ -0,0 +1,75 @@ | 
				
			|||
using System; | 
				
			|||
using System.Collections.Generic; | 
				
			|||
using System.Text; | 
				
			|||
 | 
				
			|||
namespace Apewer.Internals | 
				
			|||
{ | 
				
			|||
 | 
				
			|||
    /// <summary>锁。</summary>
 | 
				
			|||
    internal class Locker | 
				
			|||
    { | 
				
			|||
 | 
				
			|||
        Dictionary<int, Class<object>> _pool = new Dictionary<int, Class<object>>(); | 
				
			|||
 | 
				
			|||
        /// <summary>标记指定的字符串。</summary>
 | 
				
			|||
        static int Key(string s) => s == null ? 0 : s.GetHashCode(); | 
				
			|||
 | 
				
			|||
        /// <summary>清除所有缓存的锁。</summary>
 | 
				
			|||
        public void Clear() | 
				
			|||
        { | 
				
			|||
            lock (_pool) | 
				
			|||
            { | 
				
			|||
                _pool.Clear(); | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        /// <summary>锁定字符串,执行 Action。</summary>
 | 
				
			|||
        public void InLock(string text, Action action) | 
				
			|||
        { | 
				
			|||
            if (action == null) return; | 
				
			|||
 | 
				
			|||
            var key = Key(text); | 
				
			|||
            Class<object> locker; | 
				
			|||
            lock (_pool) | 
				
			|||
            { | 
				
			|||
                if (!_pool.TryGetValue(key, out locker)) | 
				
			|||
                { | 
				
			|||
                    locker = new Class<object>(); | 
				
			|||
                    _pool.Add(key, locker); | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            lock (locker.Value) | 
				
			|||
            { | 
				
			|||
                action.Invoke(); | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        /// <summary>锁定字符串,执行 Func。</summary>
 | 
				
			|||
        public T InLock<T>(string text, Func<T> func) | 
				
			|||
        { | 
				
			|||
            if (func == null) return default; | 
				
			|||
 | 
				
			|||
            var key = Key(text); | 
				
			|||
            Class<object> locker; | 
				
			|||
            lock (_pool) | 
				
			|||
            { | 
				
			|||
                if (!_pool.TryGetValue(key, out locker)) | 
				
			|||
                { | 
				
			|||
                    locker = new Class<object>(); | 
				
			|||
                    _pool.Add(key, locker); | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            T result; | 
				
			|||
            lock (locker.Value) | 
				
			|||
            { | 
				
			|||
                result = func.Invoke(); | 
				
			|||
            } | 
				
			|||
            return result; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
 | 
				
			|||
} | 
				
			|||
					Loading…
					
					
				
		Reference in new issue