Сейчас я пишу приложение на C#. Я новичок в использовании ConcurrentDictionary, поэтому у меня есть некоторые вопросы, связанные с его потокобезопасностью. Во-первых, это мой словарь:
/// <summary>
/// A dictionary of all the tasks scheduled
/// </summary>
private ConcurrentDictionary<string, ITask> tasks;
я создаю его экземпляр в своем классе и использую его для отслеживания всех моих объектов, реализующих ITask. Я хочу убедиться, что моя установка будет работать правильно в многопоточной среде.
Если несколько потоков хотят получить подсчет количества элементов в ConcurrentDictionary, нужно ли мне его блокировать?
Если я хочу получить конкретный ключ из словаря, получить объект этого ключа и вызвать для него метод, нужно ли мне его блокировать? например:
/// <summary>
/// Runs a specific task.
/// </summary>
/// <param name="name">Task name.</param>
public void Run(string name)
{
lock (this.syncObject)
{
var task = this.tasks[name] as ITask;
if (task != null)
{
task.Execute();
}
}
}
Помня о том, что несколько потоков могут вызывать метод Run, пытаясь вызвать метод Execute ITask. Моя цель — сделать все потокобезопасным и максимально производительным.