На самом деле я просто пытаюсь достичь многопоточности в C #.
Итак, у меня есть этот класс с именем WeakeningEvictionary {TKey, TValue}, который имеет частный словарь {TKey, CachedValue {TValue}}, который функционирует как кеш.CachedValue - это оболочка, которая имеет сильную и слабую ссылку на TValue.По истечении заданного времени создается задача, которая аннулирует StrongReference и помещает его в WeakReference.У меня также есть реализованный HashSet, который отслеживает, какие keyValuePairs выселить.(добавляется, когда происходит ослабление, удаляется из того, когда вызывается SetValue) Сразу после того, как GC выполнил свою работу, создается другая задача, чтобы выселить все упомянутые пары.
На самом деле мне не нужен RecursiveLock для этого, ноЯ столкнулся с проблемами, когда некоторая хранимая информация запрашивалась рекурсивно, потому что для этого требовался ряд конструкций.
Поэтому я пришел с этим кодом: (обновлен, ранее не использовался ExtensionMethod)
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);
}
}
);
}
Хорошо, что, если я использую И мой вопрос: каковы риски?Известно ли, что замыкания вызывают проблемы при использовании потоками таким образом?
Спасибо за ваш вклад; -)