Ich habe einen Bool (b
), die nur zweimal in meinem Code (neben seiner Erklärung) erscheint:"finally" nicht ausgeführt wegen Async in "try"?
try
{
b = true;
//code including await SomeAsync();
}
catch { }
finally { b = false; }
noch manchmal der try-Block wird gestartet mit b
true
sein (- vorb = true
) was nie passieren sollte, weil die Deklaration es false
verlässt, wie auch die vorherige finally
. Irgendwann wird dieser Code in einer Schleife ausgeführt, die in einigen Fällen schnell iteriert und SomeAsync()
versucht, zu viel Speicher zu verwenden. Ich nehme an, dass es eine Ausnahme von einem Typ gibt, der finally
"brechen" kann. (b
ist immer false
wie erwartet, wenn es nur eine normale Datenmenge für SomeAsync()
zu verarbeiten.)
Ich habe versucht, zu überprüfen, was Visual Studio zeigt mich mit Debug.WriteLine()
sowohl nach den try
und nach den finally
, und auch durch Anhänge zu einer Zeichenkette ein anderes Zeichen an diesen Stellen, aber dann wurde die finally
ausgeführt. Also nehme ich an, dass die langsame Verzögerung genug war, um die Ausnahme zu verhindern.
Ist das wirklich möglich? (? Irgendwelche Ideen auf, wie es zu überprüfen oder zu beheben, so dass die schließlich immer läuft)
(schließlich Blöcke kann scheitern - Fälle: Conditions when finally does not execute in a .net try..finally block)
EDIT
Ein guter Punkt war in einem Kommentar und einer Antwort - dass dieser Code mehrere Male während der awaits
gleichzeitig ausgeführt werden. Leider gibt es ein anderes Detail (dass diese Antworten mir bewusst gemacht haben, ist relevant) - nach allen Iterationen ist der Zustand b
ist true
. Das wird nicht durch Nebenläufigkeit erklärt. Ich habe auch einen if (b) return;
vor dem try
Block hinzugefügt (um zu vermeiden, das Async
anzurufen, während das vorherige läuft). Immer noch mit einer true
b
verlassen, nachdem alle Iterationen durchgeführt wurden.
Wenn 'b = true' die erste Zeile in Ihrem try-Block ist, wird es immer ausgeführt, da' b = true' nicht fehlschlagen kann. Der "try" -Block wird ausgeführt, bis er fehlschlägt. –
@EliSadoff Es ist 'wahr' _before_ diese Zeile. – ispiro
Aber warum ist das wichtig?Sie können 'b = true' zuweisen, auch wenn' b' bereits 'true' ist. Das wird keinen Fehler verursachen. –