비동기 작업

가능한 경우 동기 작업보다는 비동기 버전의 작업을 사용하는 것이 좋습니다.

동기 작업은 코드가 지시하는 대로 즉시 실행되고 코드가 다음으로 진행하기 전에 이 작업이 완료될 때까지 기다립니다. 따라서 프레임 루프의 응용 프로그램 코드 단계에서 실행됩니다. 동기 작업의 시간이 너무 오래 걸리면 프레임 루프의 길이가 늘어나서 디스플레이가 멈추는 현상이 발생할 수 있습니다.

코드에서 비동기 작업을 실행할 때는 반드시 즉시 실행할 필요는 없습니다. 응용 프로그램의 코드 및 현재 실행 스레드에 있는 다른 응용 프로그램 코드는 계속해서 실행됩니다. 그런 다음 런타임에서는 렌더링 문제가 발생하지 않도록 하면서 가능한 한 빨리 작업을 수행합니다. 일부 경우에는 백그라운드에서 실행되고 런타임 프레임 루프의 일부로는 전혀 실행되지 않습니다. 마지막으로 작업이 완료되면 런타임에서 이벤트가 전달되고 코드에서는 이 이벤트를 수신하여 추가 작업을 수행할 수 있습니다.

렌더링 문제를 방지하기 위해 비동기 작업을 예약 및 분할합니다. 따라서 응답성이 뛰어난 응용 프로그램에서는 작업을 비동기 방식으로 수행하는 것이 훨씬 쉽습니다. 자세한 내용은 인지 성능과 실제 성능 비교 를 참조하십시오.

그러나 작업을 비동기적으로 실행하는 경우 오버헤드가 발생합니다. 비동기 작업, 특히 짧은 시간 내에 완료되는 작업의 경우 실제 실행 시간이 더 길어질 수 있습니다.

런타임에서는 많은 작업들이 기본적으로 동기적이거나 비동기적이며 사용자가 이에 대한 실행 방법을 선택할 수 없습니다. 하지만 Adobe AIR에서는 동기 또는 비동기적으로 수행하도록 선택할 수 있는 세 가지 작업 종류가 있습니다.

  • File 및 FileStream 클래스 작업

    File 클래스의 많은 작업들은 동기 또는 비동기적으로 수행될 수 있습니다. 예를 들어, 파일 또는 디렉토리를 복사하거나 삭제하고 디렉토리의 내용을 나열하기 위한 메서드는 모두 비동기 버전으로 수행됩니다. 이러한 메서드에는 비동기 버전의 이름에 접미사 "Async"가 추가됩니다. 예를 들어, 파일을 비동기적으로 삭제하려면 File.deleteFile() 메서드 대신 File.deleteFileAsync() 메서드를 호출합니다.

    FileStream 객체를 사용하여 파일에서 읽거나 파일에 쓰는 경우 FileStream 객체를 여는 방식에 따라 작업이 비동기적으로 실행되는지 여부가 결정됩니다. 비동기 작업에 대해서는 FileStream.openAsync() 메서드를 사용합니다. 데이터 쓰기는 비동기적으로 수행됩니다. 데이터 읽기는 청크 단위로 수행되므로 한 번에 한 부분씩 데이터를 사용할 수 있습니다. 반면에 비동기 모드에서는 FileStream 객체가 전체 파일을 읽은 다음에 코드 실행을 계속합니다.

  • 로컬 SQL 데이터베이스 작업

    로컬 SQL 데이터베이스를 사용하여 작업할 경우 SQLConnection 객체를 통해 실행되는 모든 작업은 동기 또는 비동기 모드로 실행됩니다. 작업이 비동기적으로 실행되도록 지정하려면 SQLConnection.open() 메서드 대신 SQLConnection.openAsync() 메서드를 사용하여 데이터베이스에 연결하십시오. 데이터베이스 작업이 비동기적으로 실행될 때는 백그라운드에서 실행됩니다. 데이터베이스 엔진은 런타임 프레임 루프에서는 전혀 실행되지 않으므로 데이터베이스 작업으로 인해 렌더링 문제가 발생할 가능성이 매우 낮습니다.

    로컬 SQL 데이터베이스의 성능 향상을 위한 추가 전략은 SQL 데이터베이스 성능 을 참조하십시오.

  • Pixel Bender 독립 실행형 셰이더

    ShaderJob 클래스를 사용하면 Pixel Bender 셰이더를 통해 이미지 또는 데이터 집합을 실행하고 원시 결과 데이터에 액세스할 수 있습니다. 기본적으로 ShaderJob.start() 메서드를 호출하면 셰이더가 비동기적으로 실행됩니다. 실행 작업은 런타임 프레임 루프를 사용하지 않고 백그라운드에서 이루어집니다. ShaderJob 객체를 비동기적으로 강제로 실행하도록 하려면(권장하지 않음) true 값을 start() 메서드의 첫 번째 매개 변수에 전달합니다.

비동기적 코드 실행을 위한 이러한 내장 메커니즘 외에도 동기 대신 비동기적으로 실행되도록 자신의 코드를 직접 구성할 수도 있습니다. 실행 시간이 오래 걸릴 수 있는 작업을 실행하기 위한 코드를 작성할 경우에는 부분적으로 실행되도록 코드를 구성할 수 있습니다. 코드를 여러 부분으로 분할하면 런타임에서 코드 실행 블록 사이에 렌더링 작업을 수행할 수 있으므로 렌더링 문제가 발생할 가능성이 낮아집니다.

코드 분할을 위한 몇 가지 기술이 아래에 나열되어 있습니다. 이러한 기술의 기본적인 개념은 한 번에 작업 중 일부만 수행하도록 코드를 작성한다는 것입니다. 코드가 수행하는 작업과 작업이 중지되는 위치를 추적합니다. 작업이 남아 있는지 여부를 반복적으로 확인하고 작업이 완료될 때까지 청크에 있는 추가 작업을 수행하는 Timer 객체와 같은 메커니즘을 사용합니다.

이러한 방식으로 작업을 분할하도록 코드를 구성하기 위해 설정된 패턴은 얼마 되지 않습니다. 다음 문서 및 코드 라이브러리에서는 이러한 패턴에 대해 설명하고 자신의 응용 프로그램에서 구현해 볼 수 있는 코드를 제공합니다.