9 Stimmen

SemaphoreSlim.Wait( CancellationToken ) proper try/finally for OperationCancelledException?

Wie sollte ich die try/finally strukturieren, wenn ein SemaphorSlim mit Storno-Token verwenden, so dass OperationCancelledException korrekt behandelt wird? Bei Option A löst das Abbrechen der Token-Quelle OperationCancelledException aus, ruft aber nicht Release() auf. Bei Option B führt das Abbrechen der Token-Quelle zu OperationCancelledException und ruft Release() auf.

// option A:
_semaphorSlim.Wait( _cancellationTokenSource.Token );
try
{
     // do work here
}
finally
{
     _semaphorSlim.Release();
}

// option B:
try
{
     _semaphorSlim.Wait( _cancellationTokenSource.Token );
     // do work here
}
finally
{
     _semaphorSlim.Release();
}

9voto

Reed Copsey Punkte 536986

Option A ist hier richtiger. Sie müssen nicht Release die SemaphoreSlim wenn Sie den Vorgang abbrechen, da Sie ihn nie tatsächlich erwerben und die Anzahl erhöhen. Sie sollten also nur dann freigeben, wenn Ihr Wait Anruf tatsächlich erfolgreich war.

Von diesem MSDN-Seite zur Verwendung von Semaphore und SemaphoreSlim :

Es liegt in der Verantwortung des Programmierers, sicherzustellen, dass ein Thread die Semaphore nicht zu oft freigibt. Nehmen wir zum Beispiel an, ein Semaphor hat eine maximale Anzahl von zwei und sowohl Thread A als auch Thread B betreten den Semaphor. Wenn ein Programmierfehler in Thread B dazu führt, dass er zweimal Release aufruft, sind beide Aufrufe erfolgreich. Der Zähler auf dem Semaphor ist voll, und wenn Thread A schließlich Release aufruft, wird eine SemaphoreFullException ausgelöst.

0voto

Farjad Punkte 257

-Entschuldigen Sie die späte Antwort, hoffentlich kann sie jemandem helfen. Da wir nicht garantieren können, wann die Stornierung erfolgt und wann dieser Code ausgelöst werden könnte, müssen wir die Option A verwenden. Wenn es verwendet wurde, dann nicht die Semaphore freigeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X