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