TsgcWebTransportSession › Methoden › Close

Close Methode

Schließt die noch auf der Sitzung offenen Streams und löst ihr OnClose-Ereignis aus.

Syntax

procedure Close;

Hinweise

Close ist ein lokaler Abbau, kein Abbau auf der Leitung. Es schließt jeden auf der Sitzung noch offenen Stream und löst dabei das jeweils eigene OnClose des Streams aus, und löst anschließend das OnClose der Sitzung aus. Wenn die Methode zurückkehrt, ist StreamCount gleich 0. Sie ist gegen wiederholte Aufrufe abgesichert: Der erste Aufruf markiert die Sitzung als geschlossen, sodass ein zweiter Aufruf sofort zurückkehrt und OnClose nie zweimal ausgelöst wird. Die Absicherung wird gesetzt, bevor irgendein Ereignis läuft, daher ist es sicher, Close aus OnClose heraus erneut aufzurufen.

Was es bewusst nicht tut:

Verwenden Sie es als lokales Signal, dass Ihre Anwendung mit der Sitzung fertig ist, und hängen Sie Ihre eigene Bereinigung an OnClose.

Um die Sitzung tatsächlich zu beenden, entfernen Sie den darunter liegenden Transport. Rufen Sie auf dem Client TsgcHTTP3Client.Disconnect auf oder geben Sie den Client frei, wodurch die QUIC-Verbindung abgebaut und jede Sitzung und jeder Stream freigegeben wird, die er besitzt. Schließen Sie auf dem Server die QUIC-Verbindung. Das Sitzungsobjekt gehört in beiden Fällen der Registrierung der Verbindung, geben Sie es daher niemals selbst frei.

Da Close nichts freigibt, bleiben die Sitzung und ihre Streams nach der Rückkehr gültig. Behandeln Sie eine geschlossene Sitzung dennoch als beendet und schreiben Sie nicht mehr darauf.

.NET-Unterschied. Auf dem verwalteten Stack ruft der Client Close für Sie auf: Eine Hintergrundaufgabe überwacht den CONNECT-Stream, und wenn der Server ihn leert oder verwirft, entfernt diese Aufgabe die Sitzung aus der Registry und ruft Close auf. Unter .NET kann OnClose daher ohne Ihr Zutun ausgelöst werden und signalisiert, dass der Peer die Sitzung beendet hat. In Delphi und C++Builder ruft nichts Close für Sie auf, sodass OnClose nur ausgelöst wird, wenn Ihr eigener Code es aufruft. Der Abbau selbst ist auf jedem Stack gleich: Close schließt die offenen Streams der Sitzung, sodass StreamCount auf 0 fällt, und es ist gegen wiederholte Aufrufe abgesichert, sodass OnClose höchstens einmal ausgelöst wird.

Beispiel


procedure TfrmClient.btnDisconnectClick(Sender: TObject);
begin
  tmrPump.Enabled := False;

  // Notify our own handler that we are finished with the session.
  if Assigned(FSession) then
    FSession.Close;   // closes its open streams, then raises OnClose

  // This is what actually ends the session: dropping the QUIC connection.
  FClient.Disconnect;
  FSession := nil;    // owned by the client, do not free
  FStream := nil;     // owned by the session, do not free
end;

procedure TfrmClient.OnSessionClose(Sender: TObject);
begin
  memoLog.Lines.Add('session closed, releasing application state');
end;

Zurück zu Methoden