Должно ли быть достаточно обернуть потокобезопасный объект для обеспечения безопасности потока? - PullRequest
0 голосов
/ 21 ноября 2019

Я хочу инкапсулировать вызовы ASP.Net MemoryCache в классе, который работает с бизнес-типами.

Я написал это:

public interface IMyModelStore 
{
    MyModel RetrieveMyModel(Guid id);
    void StoreMyModel(MyModel obj);
}

public sealed class InMemoryCache : IMyModelStore
{
    public static  InMemoryCache Instance { get; } = new InMemoryCache(TimeSpan.FromMinutes(30));

    private readonly TimeSpan _expiration;

    private readonly CacheItemPolicy _cachePolicy;

    private InMemoryCache(TimeSpan expiration)
    {
        this._expiration = expiration;
        _cachePolicy = new CacheItemPolicy
        {
            SlidingExpiration = _expiration 
        };
    }

    public RetrieveMyModel(Guid id)
    {
        if (id == Guid.Empty) throw new ArgumentOutOfRangeException(nameof(id));

        return (MyModel)MemoryCache.Default.Get(id.ToString());
    }

    public void StoreMyModel(MyModel obj)
    {
        MemoryCache.Default.Add(obj.Id.ToString(), obj, _cachePolicy);
    }
}

Мне кажется, что у меня нетиметь дело с безопасностью потока, потому что мой код только получает и передает данные в MemoryCache, который является потокобезопасным.

Я прав?

Единственный случай, который может вызвать проблемы, этокогда поток вызывает RetrieveMyModel одновременно, другой вызывает StoreMyModel с тем же идентификатором.

1 Ответ

2 голосов
/ 21 ноября 2019

Ваш класс является потокобезопасным (в настоящее время). Не нужно добавлять сложность, чтобы быть потокобезопасным.

Единственный случай, который, я думаю, может вызвать проблемы, - это когда поток вызывает RetrieveMyModel в то же время, когда другой вызывает StoreMyModel с тем же идентификатором.

RetrieveMyModel и StoreMyModel являются потокобезопасными, некоторые потоки могут вызывать эти методы с одинаковым идентификатором без риска. Возврат RetrieveMyModel будет зависеть от порядка исполнения.

...