TsgcWebTransportSession › Methoden › RemoveStream
Hebt die Registrierung eines Streams in der Liste der offenen Streams der Sitzung auf.
procedure RemoveStream(const aStream: TsgcWebTransportStream);
| Name | Typ | Beschreibung |
|---|---|---|
aStream | const TsgcWebTransportStream | Der zu entfernende Stream. Die Übergabe von nil ist sicher und bewirkt nichts. Die Übergabe eines Streams, der zu einer anderen Sitzung gehört, oder eines bereits entfernten Streams bewirkt ebenfalls nichts. |
Sie müssen dies nur selten selbst aufrufen. TsgcWebTransportStream.Close ruft es für Sie auf, sodass sich ein Stream abmeldet, sobald er geschlossen wird. Dadurch sinkt StreamCount, und nach dem Aufruf gibt FindStreamById diesen Stream nicht mehr zurück.
Das Stream-Objekt wird nicht freigegeben. Der Stream wird aus der Liste der offenen Streams entfernt und in eine interne Liste geschlossener Streams verschoben, die ihn besitzt und beim Zerstören der Sitzung freigibt. Zu jedem Zeitpunkt besitzt genau eine Liste einen Stream, sodass er genau einmal freigegeben wird und nie ein Leck entsteht. aStream bleibt daher nach dem Aufruf gültig, ebenso jede Referenz, die Ihr Code und der HTTP/3-Demux noch halten. Der Aufruf ist auch innerhalb des OnData- oder OnClose-Handlers desselben Streams sicher.
Geschlossene Streams werden erst freigegeben, wenn die Sitzung endet, eine langlebige Sitzung, die fortlaufend Streams öffnet, sammelt die geschlossenen Objekte also weiterhin an, begrenzt durch die Lebensdauer der QUIC-Verbindung. Das ist ein bewusster Kompromiss: Die Objekte am Leben zu halten ist genau das, was die von Ihnen gehaltenen Zeiger sicher bleiben lässt. Wenn das Volumen für Ihre Arbeitslast eine Rolle spielt, öffnen Sie besser weniger, dafür langlebigere Streams.
RemoveStream schließt den zugrunde liegenden QUIC-Stream nicht, löst OnClose nicht aus und benachrichtigt den Peer nicht. Es ist ein reiner Verwaltungsaufruf. Rufen Sie stattdessen Close auf dem Stream auf, wenn Ihre Handler davon erfahren müssen, denn das löst OnClose aus und meldet den Stream ab.
Die Operation wird durch die kritische Sektion der Sitzung geschützt, sie kann daher sicher aufgerufen werden, während ein anderer Thread StreamCount liest oder FindStreamById aufruft. Auch ein anderer Thread, der denselben Stream-Zeiger hält, ist sicher, da hier nichts freigegeben wird.
Dieses Mitglied ist derzeit nur in der Delphi/C++Builder-Implementierung verfügbar. Die .NET-Klasse besitzt ein internal RemoveStream(long streamId), das über die Id statt über das Objekt adressiert wird und aus Anwendungscode nicht aufrufbar ist; dort verwaltet der Garbage Collector die Lebensdauer, sodass kein Freigeben erforderlich ist.
// Finishing with a stream on a long-lived session.
procedure TfrmClient.FinishRequest(const aStream: TsgcWebTransportStream);
var
oSession: TsgcWebTransportSession;
begin
oSession := aStream.Session;
// Close is enough: it unregisters the stream (calling RemoveStream for us)
// and then raises OnClose. Calling RemoveStream here as well would be
// redundant. The stream object stays valid either way.
aStream.Close;
memoLog.Lines.Add('streams still open: ' +
IntToStr(oSession.StreamCount));
end;