Выбор элемента из ConcurrentDictionary синхронизированным способом - PullRequest
0 голосов
/ 17 января 2020

У меня есть список заданий, к которым одновременно могут обращаться несколько пользователей. Я хочу убедиться, что пользователю будет назначена только уникальная работа. Поэтому я использую ConcurrentDictionary, который обеспечивает потокобезопасный доступ к элементам, а также позволяет удалить элемент после повторного получения.

Важно: выбор элемента в коллекции основан на запросе linq.

Однако на основе документации

доступ к элементам объекта коллекции с помощью методов расширения или с помощью явных реализаций интерфейса не гарантируется поточно-ориентированная и может потребоваться синхронизация вызывающей стороной.

Вопрос.

Поскольку выбор элемента не гарантируется поточно-ориентированным (с LINQ), нужно ли использовать lock при выборе элемента? Если мне нужно использовать lock, тогда нужно ли использовать ConcurrentDictionary или я могу просто использовать Dictionary?

Ниже приведены мои реализации.

public class CacheManager
{
    private static ConcurrentDictionary<int, Job> Jobs = null;
    static object myLock = new object();

    public Job FindJob(int userId, string title, int[] skills)
    {
        lock (myLock)
        {
            if (Jobs == null)
            {
                Jobs = MockData.LoadData();
            }

            var job = Jobs.Values.Where(j => j.Title == title &&
                                     !j.Skills.Except(skills).Any())
                                .FirstOrDefault();

            if (job != null)
            {
                Jobs.Remove(job.JobID, out job);
            }

            return job;
        }
    }
}

public class Job
{
    public int JobID { get; set; }
    public string Title { get; set; }
    public int[] Skills { get; set; }
}
...