Yield: Kontrolle zurückgeben ohne zu beenden

Methode der Klasse: ModlEnv

  TeamWiSE.TAA.YieldEnum Yield ( System.UInt32 dwTimeOut )
  TeamWiSE.TAA.YieldEnum Yield ( )

Yield entspricht mit einigen Einschränkungen einem UnRegister mit anschließendem neuem Register:

Wie beim UnRegister, geht die Kontrolle an das aufrufende Modul zurück; jedoch wird das Modul nicht beendet, sondern wartet darauf, wieder benutzt zu werden. Die lokalen Datenobjekte, die beim UnRegister zerstört werden, bewahrt die TAA-Infrastruktur beim Yield für weitere Benutzung auf.

Sobald die TAA-Infrastruktur feststellt, dass der Baustein wieder benötigt wird, so führt sie automatisch einen neuen Register durch und startet dasselbe Modul neu. (Zum Vergleich: Beim „echten“ UnRegister/Register würde eine neue Instanz des Moduls gestartet, beim Yield wird dieselbe Instanz lediglich durchgestartet). Dadurch bleiben auch die in .Net angelegten Variablen erhalten.

Über das Argument dwTimeout können Sie angeben, nach wieviel Millisekunden (z.B. 30 Sekunden = 30.000 Millisekunden) die Infrastruktur auf jeden Fall die Kontrolle an den Baustein zurückgeben soll, auch wenn die Verarbeitung, auf die er wartet, noch nicht beendet ist. Wenn Sie nichts angeben, wird als Default 300 Millisekunden angenommen.

Mögliche Rückkehrwerte von Yield, auf die der Baustein reagieren muss, sind in der Klasse YieldEnum festgelegt:

  • Error Die TAA-Infrastruktur konnte den Yield nicht ausführen. Dieser Fehler tritt z.B. auf, wenn der Baustein noch nicht angemeldet ist (Register).
  • Resume Der Baustein wird, wie erwartet, nochmals benötigt. Der Resume kann so verstanden werden, dass ein neuer Register erfolgte, nur dass in diesem Fall die .Net-Variablen und lokale TAA-Datenobjekte erhalten blieben. Wie nach einem „normalen“ Register, sollte der Baustein nun also zunächst feststellen, welche Operation ausgelöst wurde und welche Parameterobjekte übergeben wurden.
  • CleanUp Die Infrastruktur hat festgestellt, dass keine Rückkehr in den aktuellen Baustein mehr erfolgt, und hat bereits automatisch ein UnRegister des aktuellen Bausteins durchgeführt. Der Baustein hat noch die Möglichkeit, aufzuräumen; bei der TAA-Infrastruktur ist er zu dem Zeitpunkt schon nicht mehr bekannt (genauso wie nach UnRegister).
  • Timeout Die Infrastruktur hat die Kontrolle an den Baustein zurückgegeben, da die mit dwTimeout angegebene Wartezeit abgelaufen ist.

Wenn das Modul nach der Wartezeit zum Zuge kommt, hat es die Möglichkeit, z.B. eine Warteanzeige (Uhr o.ä.) zu aktualisieren, und kann dafür sorgen, dass für Fenster, die noch auf dem Bildschirm sichtbar sind, ein Refresh erfolgt. Es ist auch möglich, das Modul zu beenden, um Ressourcen freizugeben (kein UnRegister mehr nötig).

Einschränkungen und Hinweise

  • Refresh der Fenster während Timeout: Wenn Fenster während des Yield sichtbar bleiben, sollte regelmäßig ein Refresh darauf stattfinden. Die Abstände zwischen den Refreshs sollten nicht zu lang sein (keine zu lange Wartezeit festlegen). Außerdem sollten Sie dafür sorgen, dass die Knöpfe und Felder auf solchen Fenstern nicht benutzt werden können, da bei der Abarbeitung der sog. Messagequeue versucht werden würde, auf diese Benutzung zu reagieren; dies würde mit Sicherheit zu einem Laufzeitfehler führen.

Alternativ können die Fenster während der Wartezeit unsichtbar gemacht werden. Nicht vergessen, nach dem Resume die Fenster wieder sichtbar zu machen und die Controls wieder zu aktivieren!

  • Nach dem Resume kann die TAA-Infrastruktur die Fenster des Moduls nicht automatisch in den Vordergrund bringen, wenn sie nicht „enabled“ oder nicht sichtbar sind.
  • Yield braucht einen TAA-Aufrufer: Ein Yield ist nur möglich, wenn das Modul einen Aufrufer hat. Wenn ein Modul z.B. direkt von .Net aus gestartet wurde, so hat es keinen TAA-Aufrufer und kann keinen Yield machen. Wenn ein Yield nicht möglich ist, ist der Rückkehrwert CleanUp, d.h. entspricht einem UnRegister.
  • Nicht bei Gevo-Steuerung als Aufrufer: Wenn der Aufrufer des Moduls, das einen Yield macht, eine Geschäftsvorfall-Steuerung oder -Teilsteuerung ist, so wird der Yield von der TAA-Infrastruktur abgelehnt. Grund: Innerhalb der Gevo-Steuerung kann eine Unterbrechung stattfinden, und nach einer Unterbrechung kann der aktuelle Zustand des Moduls (lokale Variablen usw.) nicht mehr hergestellt werden.
  • Namensgleichheit bei lokalem und Parameterobjekt: Wenn nach einem Resume für das neue Ereignis ein Parameterobjekt übergeben wurde, das den gleichen Namen hat wie ein lokales Objekt, das bei der vorhergehenden Operation angelegt wurde, so wird das lokale Objekt dadurch zerstört. Es gibt dann nur noch das Parameterobjekt mit diesem Namen.
dotnet:imyield · Zuletzt geändert: 09.08.2024 13:25

Copyright © 1992-2024 TeamWiSE Gesellschaft für Softwaretechnik mbH         Adressen |  Kontakt |  AGB |  Datenschutzerklärung |  Impressum