Проблема в том, что этот код может быть выполнен ( по требованию) один раз для каждого клиента, но не дважды для одного и того же клиента
Я использовал C# ConcurrentDictionary, чтобы отслеживать клиентов, которые уже находятся в процессе, и когда выполнение завершено, я удалил их из ConcurrentDictionary, что произойдет, если я попытаюсь удалить идентификатор клиента из ConcurrentDictionary, пока другой поток пытается добавить (тот же или другой ключ)? ConcurrentDictionary блокирует запись и попытка удаления не удалась?
Код: Выделить всё
private static readonly ConcurrentDictionary m_customerInProgress = new ConcurrentDictionary();
public void ExecuteLogic(int customerId)
{
if (m_customerInProgress.TryAdd(customerId, DateTime.Now) == false)
{
this.Log().Info("customer in progress ");
return;
}
try
{
DoSomething();
}
catch (Exception ex)
{
this.Log().Info("DoSomething failed ");
}
finally
{
DateTime startDateTime;
if (m_customerInProgress.TryRemove(customerId, out startDateTime) == false)
{
this.Log().Fatal("this should never happens");
}
else
{
this.Log().Info("customer finished execution");
}
}
}
Что произойдет, если попытки добавления и удаления будут выполняться одновременно для одного и того же ключа?
Что произойдет, если они будут выполняться для разных ключи?
Подробнее здесь: https://stackoverflow.com/questions/574 ... ry-add-and