Operazioni asincrone

Privilegiate le versioni asincrone delle operazioni, se disponibili, rispetto a quelle sincrone.

Le operazioni sincrone vengono eseguite non appena ricevono l'istruzione di esecuzione dal codice, che attende il loro completamento prima di proseguire. All'interno del ciclo di fotogramma, pertanto, queste operazioni vengono eseguite nella fase di esecuzione del codice dell'applicazione. Se un'operazione sincrona richiede troppo tempo, le dimensioni del ciclo di fotogramma aumentano e possono causare un blocco apparente dello schermo o una visualizzazione a scatti.

Quando il codice esegue un'operazione asincrona, l'esecuzione non è necessariamente immediata. L'esecuzione del codice della vostra applicazione e delle altre applicazioni incluse nel thread di esecuzione prosegue normalmente. Il runtime esegue quindi l'operazione appena possibile cercando allo stesso tempo di evitare che si verifichino problemi di rendering. In alcuni casi l'esecuzione avviene in background e non nell'ambito del ciclo di fotogramma runtime. Quando l'operazione viene completata, infine, il runtime invia un evento e il codice può intercettare tale evento per eseguire altre attività.

Le operazioni asincrone vengono pianificate e suddivise in modo da evitare problemi di rendering. Di conseguenza, è molto più facile ottenere un'applicazione con tempi di risposta rapidi se si utilizzano le versioni asincrone delle operazioni. Per ulteriori informazioni, vedete Differenza tra prestazioni percepite e prestazioni effettive .

L'esecuzione di operazioni in modalità asincrona comporta tuttavia un certo sovraccarico. Il tempo di esecuzione effettivo può essere maggiore per le operazioni asincrone, specialmente per quelle che vengono completate in poco tempo.

Nel runtime, molte operazioni sono intrinsecamente sincrone o asincrone e non consentono di scegliere la modalità di esecuzione. In Adobe AIR, tuttavia, esistono tre tipi di operazioni che potete scegliere di eseguire in modo sincrono o asincrono:

  • Operazioni delle classi File e FileStream

    Molte operazioni della classe File possono essere eseguite sia in modo sincrono che asincrono. I metodi utilizzati per copiare o eliminare un file o una directory ed elencare i contenuti di una directory, ad esempio, dispongono di una versione asincrona. Il nome della versione asincrona di questi metodi contiene il suffisso “Async”. Per eliminare un file in modo asincrono, ad esempio, chiamate il metodo File.deleteFileAsync() anziché il metodo File.deleteFile() .

    Quando utilizzate un oggetto FileStream per eseguire operazioni di lettura o scrittura su un file, la modalità di apertura dell'oggetto FileStream determina se le operazioni vengono eseguite in modo asincrono. Utilizzate il metodo FileStream.openAsync() per le operazioni asincrone. I dati verranno scritti in modo asincrono. I dati verranno letti a blocchi e saranno disponibili una porzione per volta. In modalità sincrona, al contrario, l'oggetto FileStream legge l'intero file prima di continuare l'esecuzione del codice.

  • Operazioni del database SQL locale

    Quando si utilizza un database SQL locale, è possibile utilizzare sia la modalità sincrona che quella asincrona per tutte le operazioni eseguite mediante un oggetto SQLConnection. Per specificare l'esecuzione asincrona delle operazioni, aprite la connessione al database utilizzando il metodo SQLConnection.openAsync() anziché il metodo SQLConnection.open() . Le operazioni di database asincrone vengono eseguite in background. Poiché il motore del database non viene eseguito nel ciclo di fotogramma runtime, è molto improbabile che le operazioni di database causino problemi di rendering.

    Per ulteriori informazioni su come migliorare le prestazioni del database SQL locale, vedete Prestazioni del database SQL .

  • Shader Pixel Bender in modalità autonoma

    La classe ShaderJob vi permette di utilizzare un'immagine o un set di dati come input per uno shader Pixel Bender e di accedere ai dati non elaborati dei risultati. Quando chiamate il metodo ShaderJob.start() , lo shader viene eseguito in modalità asincrona per impostazione predefinita. L'esecuzione avviene in background e non nel ciclo di fotogramma runtime. Per forzare l'esecuzione sincrona dell'oggetto ShaderJob (scelta non consigliata), passate il valore true al primo parametro del metodo start() .

Oltre a utilizzare questi meccanismi integrati per l'esecuzione asincrona del codice, potete strutturare il codice in modo che venga eseguito in modo asincrono anziché sincrono. Quando scrivete il codice di un'attività con tempi di esecuzione potenzialmente lunghi, potete strutturare il codice in modo che l'esecuzione avvenga in più parti. Suddividendo il codice in più parti consentirete al runtime di eseguire le operazioni di rendering tra i vari blocchi di esecuzione del codice, riducendo la probabilità che si verifichino problemi di rendering.

Di seguito vengono elencate varie tecniche che potete utilizzare per suddividere il codice. Tutte queste tecniche si basano sul principio che il codice viene scritto in modo da eseguire solo una parte delle attività previste in ogni momento specifico. Tracciate le attività eseguite dal codice e verificate in quali momenti si interrompe l'esecuzione. Utilizzate meccanismi come un oggetto Timer per verificare a più riprese se sono rimaste attività in sospeso ed eseguirle in blocchi finché non sono state completate.

Esistono alcuni modelli consolidati per strutturare il codice in modo che le attività vengano suddivise nella maniera descritta. Gli articoli e le librerie di codice seguenti descrivono questi modelli e forniscono il codice necessario per implementarli nelle vostre applicazioni:

  • Articolo di Trevor McCauley contenente informazioni generali e numerosi esempi di implementazione: Asynchronous ActionScript Execution (Esecuzione asincrona del codice ActionScript)

  • Articolo di Jesse Warden contenente informazioni generali ed esempi relativi agli approcci “modello Builder” e “green thread”: Parsing & Rendering Lots of Data in Flash Player (Analisi e rendering di quantità elevate di dati in Flash Player)

  • Articolo di Drew Cummins che descrive la tecnica dei “green thread” e fornisce il codice sorgente di esempio: Green Threads

  • Libreria di codice open source di Charlie Hubbard per l'implementazione dei “green thread” in ActionScript: greenthreads . Per ulteriori informazioni, vedete greenthreads Quick Start (Guida rapida ai green thread).

  • Per ulteriori informazioni, vedete l'articolo relativo ai thread in ActionScript 3 all'indirizzo http://www.adobe.com/go/learn_fp_as3_threads_it (articolo a cura di Alex Harui contenente un esempio di implementazione della tecnica “pseudo threading”)