비동기 워크플로Asynchronous Workflows

참고

API 참조 링크를 통해 MSDN으로 이동됩니다.The API reference link will take you to MSDN. docs.microsoft.com API 참조가 완전하지 않습니다.The docs.microsoft.com API reference is not complete.

이 항목에 대 한 지원에 설명 합니다 F# 계산을 비동기적으로 수행, 즉, 다른 실행을 차단 하지 않고 작동 합니다.This topic describes support in F# for performing computations asynchronously, that is, without blocking execution of other work. 예를 들어, 비동기 계산 Ui 응용 프로그램이 다른 작업을 수행 하는 대로 사용자에 게 응답 하 게 유지 되는 응용 프로그램 작성에 사용할 수 있습니다.For example, asynchronous computations can be used to write applications that have UIs that remain responsive to users as the application performs other work.

구문Syntax

async { expression }

설명Remarks

이전 구문에서 계산으로 표현 expression 비동기적으로 비동기 대기 작업, I/O 및 다른 비동기 작업을 수행할 때 현재 계산 스레드를 차단 하지 않고 즉, 실행 하도록 설정 됩니다.In the previous syntax, the computation represented by expression is set up to run asynchronously, that is, without blocking the current computation thread when asynchronous sleep operations, I/O, and other asynchronous operations are performed. 현재 스레드에서 계속 실행 하는 동안 백그라운드 스레드에서 비동기 계산 자주 시작 됩니다.Asynchronous computations are often started on a background thread while execution continues on the current thread. 식의 형식이 Async<'T>, 여기서 'T 식에서 반환한 형식입니다 때는 return 키워드를 사용 합니다.The type of the expression is Async<'T>, where 'T is the type returned by the expression when the return keyword is used. 이러한 식의 코드 라고 하는 비동기 블록, 또는 비동기 블록합니다.The code in such an expression is referred to as an asynchronous block, or async block.

비동기적으로 프로그래밍 하는 방법을 다양 하며 Async 클래스는 몇 가지 시나리오를 지 원하는 메서드를 제공 합니다.There are a variety of ways of programming asynchronously, and the Async class provides methods that support several scenarios. 일반적인 방법은 만들려는 Async 이상의 계산을 비동기적으로 실행 하려는 나타내고 다음 트리거 함수 중 하나를 사용 하 여 이러한 계산을 시작 하는 개체입니다.The general approach is to create Async objects that represent the computation or computations that you want to run asynchronously, and then start these computations by using one of the triggering functions. 트리거 함수는 비동기 계산을 실행 하는 여러 가지를 제공 하 고 것을 사용할지에 따라 다름 여부는 현재 스레드, 백그라운드 스레드에서 또는.NET Framework 작업 개체를 사용 하려면 연속 인지 하 고 계산이 완료 될 때 실행 되어야 하는 함수입니다.The various triggering functions provide different ways of running asynchronous computations, and which one you use depends on whether you want to use the current thread, a background thread, or a .NET Framework task object, and whether there are continuation functions that should run when the computation finishes. 예를 들어, 현재 스레드에서 비동기 계산을 시작 하려면 사용할 수 있습니다 Async.StartImmediate 합니다.For example, to start an asynchronous computation on the current thread, you can use Async.StartImmediate. UI 스레드에서 비동기 계산을 시작 하는 경우 응용 프로그램의 응답성을 유지 하도록 키 입력 및 마우스 활동과 같은 사용자 작업을 처리 하는 주요 이벤트 루프를 차단 하지 않습니다.When you start an asynchronous computation from the UI thread, you do not block the main event loop that processes user actions such as keystrokes and mouse activity, so your application remains responsive.

Let을 사용 하 여 비동기 바인딩!Asynchronous Binding by Using let!

비동기 워크플로, 식 및 작업 일부는 동기화 버전을 결과 비동기적으로 반환 하도록 설계 된 긴 계산 합니다.In an asynchronous workflow, some expressions and operations are synchronous, and some are longer computations that are designed to return a result asynchronously. 비동기적으로 일반적인 대신 메서드를 호출 하는 경우 let 바인딩을 사용할 let!합니다.When you call a method asynchronously, instead of an ordinary let binding, you use let!. 미치는 let! 계산을 수행 하는 다른 계산 이나 스레드가 계속 실행 하도록 합니다.The effect of let! is to enable execution to continue on other computations or threads as the computation is being performed. 오른쪽에 있는 후는 let! 바인딩 실행을 다시 시작 비동기 워크플로 나머지를 반환 합니다.After the right side of the let! binding returns, the rest of the asynchronous workflow resumes execution.

다음 코드는 차이점을 보여 줍니다 letlet!입니다.The following code shows the difference between let and let!. 사용 하는 코드 줄 let 방금 예를 들어,를 사용 하 여 나중에 실행할 수 있는 개체는 비동기 계산을 만듭니다 Async.StartImmediate 하거나 Async.RunSynchronously 합니다.The line of code that uses let just creates an asynchronous computation as an object that you can run later by using, for example, Async.StartImmediate or Async.RunSynchronously. 사용 하는 코드 줄 let! 계산이 시작 되 고 결과 지점 실행이 계속에서 제공 될 때까지 스레드가 일시 중단 하는 다음입니다.The line of code that uses let! starts the computation, and then the thread is suspended until the result is available, at which point execution continues.

// let just stores the result as an asynchronous operation.
let (result1 : Async<byte[]>) = stream.AsyncRead(bufferSize)
// let! completes the asynchronous operation and returns the data.
let! (result2 : byte[])  = stream.AsyncRead(bufferSize)

외에 let!를 사용할 수 있습니다 use! 비동기 바인딩을 수행 하 합니다.In addition to let!, you can use use! to perform asynchronous bindings. 차이점 let! 하 고 use! 차이와 같습니다 letuse합니다.The difference between let! and use! is the same as the difference between let and use. 에 대 한 use!, 현재 범위의 종료 되는 개체를 삭제 합니다.For use!, the object is disposed of at the close of the current scope. 현재에서 릴리스를 확인 합니다 F# 언어 use! 도 null로 초기화할 값을 허용 하지 않습니다 use 않습니다.Note that in the current release of the F# language, use! does not allow a value to be initialized to null, even though use does.

비동기 기본 형식Asynchronous Primitives

단일 비동기 작업을 수행 하 고 결과 반환 하는 메서드가 호출 되는 비동기 기본에 사용할 수 있도록 설계 되었습니다 및 let!합니다.A method that performs a single asynchronous task and returns the result is called an asynchronous primitive, and these are designed specifically for use with let!. 여러 비동기 기본 형식에 정의 된는 F# 핵심 라이브러리입니다.Several asynchronous primitives are defined in the F# core library. 웹 응용 프로그램에 대 한 이러한 두 메서드는 모듈에 정의 되어 Microsoft.FSharp.Control.WebExtensions : WebRequest.AsyncGetResponse WebClient.AsyncDownloadString 합니다.Two such methods for Web applications are defined in the module Microsoft.FSharp.Control.WebExtensions: WebRequest.AsyncGetResponse and WebClient.AsyncDownloadString. 두 기본 URL이 주어 지는 웹 페이지에서 데이터를 다운로드 합니다.Both primitives download data from a Web page, given a URL. AsyncGetResponse 생성 된 System.Net.WebResponse 개체 및 AsyncDownloadString 웹 페이지의 HTML을 나타내는 문자열을 생성 합니다.AsyncGetResponse produces a System.Net.WebResponse object, and AsyncDownloadString produces a string that represents the HTML for a Web page.

비동기 I/O 작업에 대 한 몇 가지 기본 형식에 포함 되는 Microsoft.FSharp.Control.CommonExtensions 모듈입니다.Several primitives for asynchronous I/O operations are included in the Microsoft.FSharp.Control.CommonExtensions module. 이러한 확장 메서드는 System.IO.Stream 클래스 Stream.AsyncRead 하 고 Stream.AsyncWrite 합니다.These extension methods of the System.IO.Stream class are Stream.AsyncRead and Stream.AsyncWrite.

또한 전체 본문이 비동기 블록 포함 되는 함수를 정의 하 여 비동기 고유한 기본형을 작성할 수 있습니다.You can also write your own asynchronous primitives by defining a function whose complete body is enclosed in an async block.

다른 비동기 모델을 위해 설계 된.NET Framework에서 비동기 메서드를 사용 하는 F# 비동기 프로그래밍 모델을 만든 반환 하는 함수는 F# Async 개체입니다.To use asynchronous methods in the .NET Framework that are designed for other asynchronous models with the F# asynchronous programming model, you create a function that returns an F# Async object. F# 라이브러리에이 쉽게 수행할 수 있도록 하는 기능입니다.The F# library has functions that make this easy to do.

비동기 워크플로 사용 하는 한 가지 예는 여기서 포함 메서드에 대 한 설명서에도 많은 키워드가 합니다 비동기 클래스합니다.One example of using asynchronous workflows is included here; there are many others in the documentation for the methods of the Async class.

이 예제에서는 병렬에서 계산을 수행 하려면 비동기 워크플로 사용 하는 방법을 보여 줍니다.This example shows how to use asynchronous workflows to perform computations in parallel.

다음 코드 예제에서는 함수에서에서 fetchAsync 웹 요청에서 반환 된 HTML 텍스트를 가져옵니다.In the following code example, a function fetchAsync gets the HTML text returned from a Web request. fetchAsync 함수는 비동기 코드 블록을 포함 합니다.The fetchAsync function contains an asynchronous block of code. 바인딩을 수행 때 결과 비동기 기본 형식에이 예제의 AsyncDownloadString , let!When a binding is made to the result of an asynchronous primitive, in this case AsyncDownloadString, let! let 대신 사용 됩니다.is used instead of let.

함수를 사용 하면 Async.RunSynchronously 를 비동기 작업을 실행 하 고 해당 결과 기다립니다.You use the function Async.RunSynchronously to execute an asynchronous operation and wait for its result. 예를 들어 하면 병렬로 실행할 수 있는 여러 비동기 작업을 사용 하 여 합니다 Async.Parallel 와 함께 함수를 Async.RunSynchronously 함수입니다.As an example, you can execute multiple asynchronous operations in parallel by using the Async.Parallel function together with the Async.RunSynchronously function. Async.Parallel 함수는 목록을 합니다 Async 개체, 각각에 대 한 코드를 설정 Async 작업 개체를 실행 하려면 병렬로 반환에는 Async 병렬 계산을 나타내는 개체입니다.The Async.Parallel function takes a list of the Async objects, sets up the code for each Async task object to run in parallel, and returns an Async object that represents the parallel computation. 호출 하는 단일 작업의 경우 처럼 Async.RunSynchronously 실행을 시작 합니다.Just as for a single operation, you call Async.RunSynchronously to start the execution.

runAll 함수는 동시에 세 개의 비동기 워크플로 시작 하 고 모두 완료 될 때까지 기다립니다.The runAll function launches three asynchronous workflows in parallel and waits until they have all completed.

open System.Net
open Microsoft.FSharp.Control.WebExtensions

let urlList = [ "Microsoft.com", "http://www.microsoft.com/"
                "MSDN", "http://msdn.microsoft.com/"
                "Bing", "http://www.bing.com"
              ]

let fetchAsync(name, url:string) =
    async {
        try
            let uri = new System.Uri(url)
            let webClient = new WebClient()
            let! html = webClient.AsyncDownloadString(uri)
            printfn "Read %d characters for %s" html.Length name
        with
            | ex -> printfn "%s" (ex.Message);
    }

let runAll() =
    urlList
    |> Seq.map fetchAsync
    |> Async.Parallel
    |> Async.RunSynchronously
    |> ignore

runAll()

참고자료See also