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.
75 lines
1.8 KiB
75 lines
1.8 KiB
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;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|