Was passiert in ConcurrentDictionary, wenn es beim Versuch, etwas hinzuzufügen und zu entfernen, zu einer Absprache komm
Posted: 13 Jan 2025, 11:40
In meinem BL möchte ich, dass ein bestimmter Code nicht ausgeführt wird, während ein anderer Thread bereits läuft.
Das Problem ist, dass der Code ausgeführt werden kann ( nach Bedarf) einmal für jeden Kunden, aber nicht zweimal für denselben Kunden
Ich habe das C# ConcurrentDictionary verwendet, um den Überblick zu behalten, welche Kunden bereits in Bearbeitung sind und wann Die Ausführung ist abgeschlossen. Ich habe sie aus dem ConcurrentDictionary entfernt., was wird Passiert das, wenn ich versuche, die Kunden-ID aus dem ConcurrentDictionary zu entfernen, während ein anderer Thread versucht, (den gleichen oder einen anderen Schlüssel) hinzuzufügen? Ist das ConcurrentDictionary für das Schreiben gesperrt und der Versuch, es zu entfernen, schlägt fehl?
Kann das this.Log().Fatal("dies sollte niemals passieren"); jemals passieren?
Was passiert, wenn die Befehle „Try Add“ und „Try Remove“ gleichzeitig für denselben Schlüssel ausgeführt werden?
Was passiert, wenn sie für verschiedene Schlüssel ausgeführt werden? Schlüssel?
Das Problem ist, dass der Code ausgeführt werden kann ( nach Bedarf) einmal für jeden Kunden, aber nicht zweimal für denselben Kunden
Ich habe das C# ConcurrentDictionary verwendet, um den Überblick zu behalten, welche Kunden bereits in Bearbeitung sind und wann Die Ausführung ist abgeschlossen. Ich habe sie aus dem ConcurrentDictionary entfernt., was wird Passiert das, wenn ich versuche, die Kunden-ID aus dem ConcurrentDictionary zu entfernen, während ein anderer Thread versucht, (den gleichen oder einen anderen Schlüssel) hinzuzufügen? Ist das ConcurrentDictionary für das Schreiben gesperrt und der Versuch, es zu entfernen, schlägt fehl?
Code: Select all
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");
}
}
}
Was passiert, wenn die Befehle „Try Add“ und „Try Remove“ gleichzeitig für denselben Schlüssel ausgeführt werden?
Was passiert, wenn sie für verschiedene Schlüssel ausgeführt werden? Schlüssel?