Asynchrone Operationen

Geben Sie der asynchronen Version von Operationen den Vorzug gegenüber synchronen Versionen, falls möglich.

Synchrone Operationen werden ausgeführt, sobald der Code dies befiehlt, und der Code wird erst dann fortgesetzt, wenn die Operationen abgeschlossen sind. Deshalb werden sie in der Anwendungscodephase der Bildschleife ausgeführt. Wenn eine synchrone Operation zu lange dauert, dehnt sie die Größe der Bildschleife aus, wodurch die Anzeige stehenbleiben („einfrieren“) oder stocken kann.

Wenn der Code eine asynchrone Operation ausführt, muss diese nicht notwendigerweise sofort ausgeführt werden. Ihr Code und weiterer Anwendungscode im aktuellen Ausführungs-Thread werden weiterhin ausgeführt. Die Laufzeit führt die Operation so bald wie möglich aus und versucht dabei, Probleme beim Rendern zu vermeiden. In einigen Fällen erfolgt die Ausführung im Hintergrund und nicht als Teil der Bildschleife der Laufzeitumgebung. Wenn die Operation abgeschlossen ist, setzt die Laufzeitumgebung ein Ereignis ab und Ihr Code kann einen Listener für dieses Ereignis verwenden, um weitere Aufgaben auszuführen.

Asynchrone Operationen sind geplant und werden aufgeteilt, um Renderingprobleme zu vermeiden. Folglich ist es mit asynchronen Operationen viel einfacher, eine reagierende Anwendung zu behalten. Weitere Informationen finden Sie unter Wahrgenommene Leistung und tatsächliche Leistung .

Die asynchrone Ausführung von Operationen erfordert jedoch einige Ressourcen. Die tatsächliche Ausführungszeit kann für asynchrone Operationen länger sein, besonders bei Operationen, die nur wenig Zeit erfordern.

In der Laufzeitumgebung sind viele Operationen von Natur aus synchron oder asynchron, sodass Sie nicht wählen können, wie sie ausgeführt werden. In Adobe AIR gibt es jedoch drei Arten von Operationen, für die Sie zwischen synchroner und asynchroner Ausführung wählen können:

  • Operationen der File- und FileStream-Klasse

    Viele Operationen der File-Klasse können synchron oder asynchron ausgeführt werden. Die Methoden zum Kopieren oder Löschen von Dateien und Ordnern sowie zum Auflisten von Verzeichnisinhalten gibt es zum Beispiel jeweils in einer asynchronen Version. Bei diesen Methoden steht das Suffix „Async“ hinter dem Namen der asynchronen Version. Um zum Beispiel eine Datei asynchron zu löschen, rufen Sie die File.deleteFileAsync() -Methode anstatt der File.deleteFile() -Methode auf.

    Wenn Sie ein FileStream-Objekt zum Lesen aus einer Datei oder zum Schreiben in eine Datei verwenden, bestimmt die Art, wie das FileStream-Objekt geöffnet wird, ob die Operationen asynchron ausgeführt werden. Verwenden Sie die FileStream.openAsync() -Methode für asynchrone Operationen. Das Schreiben der Daten erfolgt asynchron. Daten werden in Blöcken geschrieben, sodass die Daten jeweils portionsweise verfügbar sind. Im Gegensatz dazu liest das FileStream-Objekt im synchronen Modus die gesamte Datei, bevor die Codeausführung fortgesetzt wird.

  • Lokale SQL-Datenbankoperationen

    Beim Arbeiten mit einer lokalen SQL-Datenbank werden alle Operationen, die durch ein SQLConnection-Objekt ausgeführt werden, entweder im synchronen oder asynchronen Modus ausgeführt. Um festzulegen, dass Operationen asynchron ausgeführt werden, öffnen Sie die Verbindung zur Datenbank mit der SQLConnection.openAsync() -Methode statt mit der SQLConnection.open() -Methode. Wenn Datenbankoperationen asynchron ausgeführt werden, laufen sie im Hintergrund. Die Datenbankengine wird nicht in der Laufzeitbildschleife ausgeführt, sodass es durch Datenbankoperationen sehr wahrscheinlich nicht zu Renderingproblemen kommt.

    Informationen zu weiteren Strategien zur Leistungsverbesserung mit lokalen SQL-Datenbanken finden Sie unter SQL-Datenbankleistung .

  • Eigenständige Pixel Bender-Shader

    Mit der ShaderJob-Klasse können Sie ein Bild oder einen Satz von Daten durch einen Pixel Bender-Shader ausführen und auf die unformatierten Ergebnisdaten zugreifen. Standardmäßig wird der Shader asynchron ausgeführt, wenn Sie die ShaderJob.start() -Methode aufrufen. Die Ausführung erfolgt im Hintergrund; die Laufzeitbildschleife wird nicht verwendet. Um die synchrone Ausführung des ShaderJob-Objekts zu erzwingen (was nicht empfohlen wird), übergeben Sie den Wert true an den ersten Parameter der start() -Methode.

Neben diesen integrierten Techniken zum asynchronen Ausführen von Code können Sie Ihren eigenen Code auch so strukturieren, dass er asynchron statt synchron ausgeführt wird. Wenn Sie Code schreiben, der eine potenziell lang dauernde Aufgabe ausführen soll, können Sie den Code so strukturieren, dass er in Teilen ausgeführt wird. Indem Sie den Code aufteilen, ermöglichen Sie der Laufzeitumgebung, die Rendervorgänge zwischen der Ausführung von Codeblöcken auszuführen, sodass es seltener zu Renderingproblemen kommt.

Nachstehend sind verschiedene Techniken zum Aufteilen des Codes aufgeführt. Der Grundgedanke hinter diesen Techniken ist es, den Code so zu schreiben, dass jeweils nur ein Teil der Aufgabe ausgeführt wird. Sie verfolgen, was der Code tut und wo er seine Arbeit unterbricht. Sie verwenden einen Mechanismus wie ein Timer-Objekt, um wiederholt zu prüfen, ob Aufgaben verbleiben, und um zusätzliche Aufgaben portionsweise auszuführen, bis die Arbeit abgeschlossen ist.

Es gibt einige bewährte Muster für die Strukturierung von Code, um Arbeit auf diese Weise aufzuteilen. In den folgenden Artikeln und Codebibliotheken werden diese Muster beschrieben und es wird Code bereitgestellt, der Ihnen bei der Implementierung der Muster in Ihre Anwendungen hilft: