You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
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; }
}
}
|