Закрытие C # и самодельный SpinLock.RecursiveEnter - PullRequest
0 голосов
/ 03 октября 2018

На самом деле я просто пытаюсь достичь многопоточности в 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);
                }
            }
        );
    }

Хорошо, что, если я использую И мой вопрос: каковы риски?Известно ли, что замыкания вызывают проблемы при использовании потоками таким образом?

Спасибо за ваш вклад; -)

1 Ответ

0 голосов
/ 03 октября 2018

Сразу же, вызов метода на 100% не будет работать: SpinLock - это тип значения, вы должны передать его по ссылке (RecursiveEnter(ref SpinLock spinLock, Action action)), а не по значению.

См. Напримерhttps://docs.microsoft.com/en-us/dotnet/api/system.threading.spinlock?view=netframework-4.7.2#remarks

Я не уверен, что это лучшая вещь для вас: вы должны начать с примитива более высокого уровня (возможно, ReaderWriterLockSlim) и улучшать вещи только с тщательным тестированием и пониманием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...