Asynkrona åtgärder

Använd asynkrona versioner av åtgärder i stället för synkrona om möjligt.

Synkrona åtgärder körs så fort koden anger det och koden väntar tills de är klara innan den går vidare. Det innebär att de körs i programkodsfasen av bildrutans slinga. Om en synkron åtgärd tar för lång tid, tänjer den bildruteslingans storlek vilket eventuellt kan leda till att visningen stoppas eller ser ryckig ut.

När koden verkställer en asynkron åtgärd behöver den inte nödvändigtvis köras direkt. Din kod och annan programkod i den aktuella körningstråden fortsätter att verkställas. Körtidsmodulen verkställer sedan åtgärden så fort som möjligt samtidigt som den försöker förhindra återgivningsproblem. I vissa fall verkställs den i bakgrunden och körs inte som en del av körtidsbildrutan alls. När åtgärden är klar skickar körtidsmodulen en händelse och din kod kan lyssna efter händelsen för att utföra andra arbeten.

Asynkrona åtgärder schemaläggs och indelas för att undvika återgivningsproblem. Därför är det mycket enklare att skapa ett svarsvilligt program med synkrona åtgärder. Mer information finns i Upplevda prestanda jämfört med verkliga prestanda .

Vissa kompromisser sker dock när åtgärder körs asynkront. Den verkliga körningstiden kan bli längre för asynkrona åtgärder, speciellt åtgärder som slutförs snabbt.

I körningsmiljön är många åtgärder i sig synkrona eller asynkrona, och du kan inte välja hur de ska köras. I Adobe AIR finns det dock tre typer av åtgärder som du välja att utföra synkront eller asynkront:

  • Åtgärder i klasserna File och FileStream

    Många åtgärder i File-klassen kan utföras synkront eller asynkront. Metoderna för att kopiera eller ta bort en fil eller katalog och visa innehållet i en katalog har t.ex. alla asynkrona versioner. Metoderna har suffixet ”Async” som läggs till i namnet för den asynkrona versionen. Om du t.ex. vill ta bort en fil asynkront ska du anropa metoden File.deleteFileAsync() i stället för metoden File.deleteFile() .

    Hur du öppnar ett FileStream-objekt avgör om åtgärderna utförs asynkront eller inte när ett FileStream-objekt används för att läsa från eller skriva till en fil. Använd metoden FileStream.openAsync() för asynkrona åtgärder. Skrivning av data utförs asynkront. Läsning av data utförs i segment vilket innebär att data är tillgängliga en del i taget. I synkront läge läser FileStream-objektet däremot hela filen innan koden verkställs.

  • Lokala SQL-databasåtgärder

    Alla åtgärder som verkställs via ett SQLConnection-objekt kan verkställas i synkront eller asynkront läge när du arbetar med en lokal SQL-databas. För att ange att åtgärder ska verkställas asynkront ska du öppna anslutningen till databasen med metoden SQLConnection.openAsync() i stället för metoden SQLConnection.open() . Databasåtgärder verkställs i bakgrunden när de körs asynkront. Databasmotorn körs inte i körtidsmodulens bildruteslinga alls vilket innebär att det är mycket mindre troligt att databasåtgärder orsakar återgivningsproblem.

    Information om andra strategier för att förbättra prestandan med en lokal SQL-databas finns i SQL-databasprestanda .

  • Fristående Pixel Bender-skuggningar

    Med klassen ShaderJob kan du köra en bild eller datauppsättning genom en Pixel Bender-skuggning och få åtkomst till rådataresultatet. Skuggningen verkställs asynkront som standard när du anropar metoden ShaderJob.start() . Det sker i bakgrunden utan att körtidsmodulens bildruteslinga används. För att tvinga ett ShaderJob-objekt att verkställas synkront (rekommenderas inte) ska du skicka värdet true till den första parametern i metoden start() .

I tillägg till dessa inbyggda mekanismer för att köra kod asynkront kan du även strukturera din egen kod så att den körs asynkront i stället för synkront. Om du skriver kod som ska utföra en potentiellt långvarig åtgärd kan du strukturera koden så att den verkställs i delar. Genom att dela upp koden kan körtidsmodulen utföra återgivning mellan kodkörningsblocken vilket minskar eventuella återgivningsproblem.

Flera tekniker för att dela upp kod anges nedan. Huvudtanken bakom alla dessa tekniker är att koden enbart skrivs för att utföra en del av arbetet vid ett visst tillfälle. Du kan spåra vad koden gör och när den slutar att arbeta. Du kan t.ex. använda en mekanism som ett Timer-objekt för att upprepade gånger kontrollera om det finns arbete kvar att utföra och utföra ytterligare delar av arbetet tills det är klart.

Det finns några etablerade mönster för att strukturera kod så att arbetet delas upp på det här sättet. Följande artiklar och kodbibliotek beskriver mönstren och innehåller kod som hjälper dig att implementera dem i dina program: