TsgcWebTransportStream › Ereignisse › OnClose

OnClose Ereignis

Wird ausgelöst, wenn dieser Stream geschlossen wird, entweder direkt oder weil seine Sitzung geschlossen wurde.

Syntax

property OnClose: TsgcWebTransportNotifyEvent read FOnClose write FOnClose;

// event type
TsgcWebTransportNotifyEvent = procedure(Sender: TObject) of object;

// handler signature
procedure MyStreamClose(Sender: TObject);

Parameter

NameTypBeschreibung
SenderTObjectDer TsgcWebTransportStream, der geschlossen wird. Casten Sie ihn, um StreamId zu lesen oder auf Session zuzugreifen.

Der C#-Handler erhält zusätzlich einen EventArgs-Parameter, der immer EventArgs.Empty ist und keine Informationen enthält.

Standardwert

Nicht zugewiesen. Wenn kein Handler zugewiesen ist, markiert Close den Stream dennoch als geschlossen und meldet ihn von seiner Sitzung ab.

Hinweise

Es ist keine Trennungsbenachrichtigung. Das Ereignis wird nur von Close ausgelöst, es wird also ausgelöst, wenn Ihr eigener Code oStream.Close aufruft, und auch, wenn Sie Session.Close aufrufen, was jeden auf der Sitzung noch offenen Stream schließt und dieses Ereignis daher für jeden von ihnen auslöst. Nichts anderes in der Bibliothek schließt einen Stream für Sie. Es wird nicht ausgelöst, wenn der Peer einen Stream beendet, wenn der Peer ein QUIC FIN oder RESET_STREAM sendet, wenn die QUIC-Verbindung abbricht oder wenn die Sitzung zerstört und der Stream freigegeben wird. Wenn Ihr Protokoll eine Ende-des-Streams-Markierung benötigt, senden Sie eine in der Payload; der Transport liefert Ihnen keine.

Das Ereignis wird höchstens einmal pro Stream ausgelöst: Close prüft zuerst das Closed-Flag, daher bewirkt ein zweiter Aufruf nichts. Das gilt für Delphi, C++Builder und .NET gleichermaßen.

Der Stream ist innerhalb des Handlers weiterhin vollständig gültig. Close gibt nichts frei und schließt keinen QUIC-Stream, sodass Sie StreamId lesen, auf Session zugreifen und sogar WriteData aufrufen können, was den Writer weiterhin erreicht. Betrachten Sie den Stream dennoch als beendet und schreiben Sie nicht mehr darauf. Der Stream wurde bereits von seiner Sitzung abgemeldet, wenn der Handler läuft, sodass StreamCount ihn nicht mehr zählt und Session.FindStreamById ihn nicht mehr zurückgibt.

Geben Sie den Stream nicht von hier aus frei, da die Sitzung ihn besitzt und ihn freigibt, wenn die Sitzung zerstört wird. Es ist auch nicht nötig, Session.RemoveStream(Sender) aufzurufen, weder innerhalb des Handlers noch danach, weil Close das bereits erledigt hat. Ein Aufruf ist dennoch harmlos: Er gibt nichts frei und findet den Stream einfach bereits abgemeldet vor.

Threading. Der Handler läuft auf demjenigen Thread, der Close aufgerufen hat, ohne eigene Synchronisierung. Da das üblicherweise Ihr eigener Code ist, ist es üblicherweise ein Thread, den Sie bereits kennen.

Verwenden Sie es für Symmetrie und für die Bereinigung: zum Freigeben des von Ihrer Anwendung aufgebauten streambezogenen Zustands, zum Aktualisieren einer Benutzeroberfläche oder zum Protokollieren. Es ist Ihr eigenes Signal, das über den Stream geleitet wird, damit mehrere Teile Ihres Codes es beobachten können.

Beispiel


// Assign alongside OnData, as soon as you have the stream
FStream := FSession.OpenStream(False);
FStream.OnData := OnStreamData;
FStream.OnClose := OnStreamClose;

procedure TfrmClient.OnStreamClose(Sender: TObject);
var
  oStream: TsgcWebTransportStream;
begin
  // The stream is still valid here, so its state can be read
  oStream := TsgcWebTransportStream(Sender);
  memoLog.Lines.Add(Format('stream %d closed (session %d)',
    [oStream.StreamId, oStream.Session.SessionId]));

  // Release only OUR per-stream state. Do not free the stream: the session
  // owns it. Close has already unregistered it for us.
  FPendingReplies.Remove(oStream.StreamId);
end;

// Either of these triggers it: closing the stream, or closing the session.
procedure TfrmClient.FinishExchange;
begin
  FStream.Close;    // unregisters the stream, then raises OnClose once
  FStream := nil;   // owned by the session, do not free
end;

Zurück zu Ereignissen