У меня есть список заданий, к которым одновременно могут обращаться несколько пользователей. Я хочу убедиться, что пользователю будет назначена только уникальная работа. Поэтому я использую 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; }
}