实际上,我只是想实现的是了解C#中的多线程。
所以我有一个名为WeakeningEvictionary{TKey,TValue}的类,它有一个私有的字典{TKey,CachedValue{TValue}},用作缓存。CachedValue 是一个包装器,它对 TValue 具有强引用和弱引用。在预定义的时间之后,将创建一个任务以取消强引用并将其放入弱引用中。我还有一个实现的HashSet,用于跟踪要逐出的键值对。(在弱化发生时添加,从调用 SetValue 时删除(GC 完成其工作后,立即创建另一个任务来驱逐所有提到的对。
实际上,我不需要递归锁,但是我遇到了问题,当某些存储的信息被递归询问时,因为构造序列需要这样做。
所以我想出了这段代码:(更新了,之前是一个不去工作的扩展方法(
public void RecursiveEnter(Action action)
{
if (_spinLock.IsHeldByCurrentThread)
{
action();
}
else
{
bool gotLock = false;
_spinLock.Enter(ref gotLock);//blocking until acquired
action();
if (gotLock) _spinLock.Exit();
}
}
所以我现在要做的是:
private void Evict()
{
RecursiveEnter(() =>
{
foreach (TKey key in toEvict)
{
_dict.Remove(key);
}
}
);
}
好吧,如果我使用 我的问题是:有哪些风险?线程以这种方式使用闭包是否会导致问题?
感谢您的输入;-(
马上,方法调用 100% 不起作用:SpinLock 是一种值类型,您必须通过引用 (RecursiveEnter(ref SpinLock spinLock, Action action)
( 而不是按值传递它。
例如,请参阅 https://learn.microsoft.com/en-us/dotnet/api/system.threading.spinlock?view=netframework-4.7.2#remarks
我不确定这是最适合您使用的东西:您应该从更高级别的原语(可能是 ReaderWriterLockSlim(开始,并且仅通过仔细测试和理解来完善内容。