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