C# 또는Visual Basic에서 비동기식 API 호출Call asynchronous APIs in C# or Visual Basic

UWP (유니버설 Windows 플랫폼)에는 시간이 오래 걸릴 수 있는 작업을 수행할 때 앱이 응답성을 유지할 수 있도록 하는 많은 비동기 Api가 포함 되어 있습니다.The Universal Windows Platform (UWP) includes many asynchronous APIs to ensure that your app remains responsive when it does work that might take an extended amount of time. 이 항목에서는 c # 또는 Microsoft Visual Basic에서 UWP의 비동기 메서드를 사용 하는 방법에 대해 설명 합니다.This topic discusses how to use asynchronous methods from the UWP in C# or Microsoft Visual Basic.

비동기 Api는 실행을 계속 하기 전에 응용 프로그램이 대량 작업이 완료 될 때까지 기다리지 않도록 합니다.Asynchronous APIs keep your app from waiting for large operations to complete before continuing execution. 예를 들어 인터넷에서 정보를 다운로드 하는 앱은 정보가 도착할 때까지 몇 초 정도 걸릴 수 있습니다.For example, an app that downloads info from the Internet might spend several seconds waiting for the info to arrive. 동기 메서드를 사용 하 여 정보를 검색 하는 경우에는 메서드가 반환 될 때까지 앱이 차단 됩니다.If you use a synchronous method to retrieve the info, the app is blocked until the method returns. 앱은 사용자 상호 작용에 응답 하지 않으며 응답 하지 않는 것 같습니다. 사용자는 불편 해질 수 있습니다.The app won't respond to user interaction and because it seems non-responsive, the user might become frustrated. UWP는 비동기 Api를 제공 하 여 긴 작업을 수행할 때 앱이 사용자에 게 응답성을 유지 하도록 도와줍니다.By providing asynchronous APIs, the UWP helps to ensure that your app stays responsive to the user when it's performing long operations.

UWP의 대부분의 비동기 Api에는 동기 대응 항목이 없으므로 UWP (유니버설 Windows 플랫폼) 앱에서 c # 또는 Visual Basic와 함께 비동기 Api를 사용 하는 방법을 이해 해야 합니다.Most of the asynchronous APIs in the UWP don't have synchronous counterparts, so you need to be sure to understand how to use the asynchronous APIs with C# or Visual Basic in your Universal Windows Platform (UWP) app. 여기서는 UWP의 비동기 Api를 호출 하는 방법을 보여 줍니다.Here we show how to call asynchronous APIs of the UWP.

비동기 Api 사용Using asynchronous APIs

규칙에 따라 비동기 메서드에는 "Async"로 끝나는 이름이 지정 됩니다.By convention, asynchronous methods are given names that end in "Async". 사용자가 단추를 클릭 하는 경우와 같이 일반적으로 사용자 작업에 대 한 응답으로 비동기 Api를 호출 합니다.You typically call asynchronous APIs in response to a user's action, such as when the user clicks a button. 비동기 Api를 사용 하는 가장 간단한 방법 중 하나는 이벤트 처리기에서 비동기 메서드를 호출 하는 것입니다.Calling an asynchronous method in an event handler is one of the simplest ways of using asynchronous APIs. 여기서는 wait 연산자를 예로 사용 합니다.Here we use the await operator as an example.

특정 위치에서 블로그 게시물의 제목을 나열 하는 앱이 있다고 가정 합니다.Suppose that you have an app that lists the titles of blog posts from a certain location. 앱에는 사용자가 제목을 가져오기 위해 클릭 하는 단추가 있습니다.The app has a Button that the user clicks to get the titles. 제목은 TextBlock에 표시 됩니다.The titles are displayed in a TextBlock. 사용자가 단추를 클릭 하면 블로그의 웹 사이트에서 정보를 기다리는 동안 앱이 응답성을 유지 하는 것이 중요 합니다.When the user clicks the button, it is important that the app remains responsive while it waits for the info from the blog's website. 이 응답성을 보장 하기 위해 UWP에서는 SyndicationClient를 제공 하는 비동기 메서드인 RetrieveFeedAsync을 제공 합니다 .To ensure this responsiveness, the UWP provides an asynchronous method, SyndicationClient.RetrieveFeedAsync, to download the feed.

이 예제에서는 비동기 메서드인 SyndicationClient RetrieveFeedAsync를 호출 하 고 결과를 대기 하 여 블로그의 블로그 게시물 목록을 가져옵니다.The example here gets the lists of blog posts from a blog by calling the asynchronous method, SyndicationClient.RetrieveFeedAsync, and awaiting the result.

// Put the keyword async on the declaration of the event handler.
private async void Button_Click_1(object sender, RoutedEventArgs e)
{

    Windows.Web.Syndication.SyndicationClient client = new SyndicationClient();

    Uri feedUri
        = new Uri("http://windowsteamblog.com/windows/b/windowsexperience/atom.aspx");

    try
    {
        SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri);

        // The rest of this method executes after await RetrieveFeedAsync completes.
        rssOutput.Text = feed.Title.Text + Environment.NewLine;

        foreach (SyndicationItem item in feed.Items)
        {
            rssOutput.Text += item.Title.Text + ", " +
                             item.PublishedDate.ToString() + Environment.NewLine;
        }
    }
    catch (Exception ex)
    {
        // Log Error.
        rssOutput.Text =
            "I'm sorry, but I couldn't load the page," +
            " possibly due to network problems." +
            "Here's the error message I received: "
            + ex.ToString();
    }
}
' Put the keyword Async on the declaration of the event handler.
Private Async Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
    Dim client As New Windows.Web.Syndication.SyndicationClient()
    Dim feedUri As New Uri("http://windowsteamblog.com/windows/b/windowsexperience/atom.aspx")

    Try
        Dim feed As SyndicationFeed = Await client.RetrieveFeedAsync(feedUri)

        ' The rest of this method executes after the await operation completes.
        rssOutput.Text = feed.Title.Text & vbCrLf

        For Each item In feed.Items
            rssOutput.Text += $"{item.Title.Text}, {item.PublishedDate.ToString()}{vbCrLf}"
        Next

    Catch ex As Exception
        ' Log Error.
        rssOutput.Text = "I'm sorry, but I couldn't load the page," &
                         " possibly due to network problems." &
                         "Here's the error message I received: " &
                          ex.ToString()
    End Try

End Sub

이 예에 대 한 몇 가지 중요 한 사항이 있습니다.There are a couple of important things about this example. 첫 번째 줄에서는 SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) RetrieveFeedAsync비동기 메서드를 호출 하는 wait 연산자를 사용 합니다.First, the line, SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) uses the await operator with the call to the asynchronous method, RetrieveFeedAsync. Wait 연산자는 컴파일러에 비동기 메서드를 호출 하는 것으로 간주할 수 있습니다. 이렇게 하면 컴파일러가 추가 작업을 수행 하 게 됩니다.You can think of the await operator as telling the compiler that you are calling an asynchronous method, which causes the compiler to do some extra work so you don’t have to. 그런 다음 이벤트 처리기의 선언에 async키워드가 포함 됩니다.Next, the declaration of the event handler includes the keyword async. Wait 연산자를 사용 하는 메서드의 메서드 선언에이 키워드를 포함 해야 합니다.You must include this keyword in the method declaration of any method in which you use the await operator.

이 항목에서는 컴파일러가 wait 연산자를 사용 하 여 수행 하는 작업의 세부 정보를 많이 다루지 않지만 비동기 및 응답성을 위해 앱에서 수행 하는 작업을 살펴보겠습니다.In this topic, we won't go into a lot of the details of what the compiler does with the await operator, but let's examine what your app does so that it is asynchronous and responsive. 동기 코드를 사용할 때 발생 하는 상황을 고려 합니다.Consider what happens when you use synchronous code. 예를 들어 동기 인 이라는 메서드가 있다고 가정 SyndicationClient.RetrieveFeed 합니다.For example, suppose that there is a method called SyndicationClient.RetrieveFeed that is synchronous. 이러한 메서드는 없지만이 있다고 가정 합니다. 앱이 대신 줄을 포함 하는 경우에는의 SyndicationFeed feed = client.RetrieveFeed(feedUri) SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) 반환 값을 사용할 수 있을 때까지 응용 프로그램 실행이 중지 됩니다 RetrieveFeed .(There is no such method, but imagine that there is.) If your app included the line SyndicationFeed feed = client.RetrieveFeed(feedUri), instead of SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), execution of the app would stop until the return value of RetrieveFeed is available. 앱이 메서드가 완료 될 때까지 대기 하는 동안 다른 Click 이벤트와 같은 다른 이벤트에 응답할 수 없습니다.And while your app waits for the method to complete, it can't respond to any other events, such another Click event. 즉,가 반환 될 때까지 앱이 차단 됩니다 RetrieveFeed .That is, your app would be blocked until RetrieveFeed returns.

하지만를 호출 하 client.RetrieveFeedAsync 는 경우 메서드는 검색을 시작 하 고 즉시를 반환 합니다.But if you call client.RetrieveFeedAsync, the method initiates the retrieval and immediately returns. RetrieveFeedAsync와 함께 wait 를 사용 하는 경우 앱은 일시적으로 이벤트 처리기를 종료 합니다.When you use await with RetrieveFeedAsync, the app temporarily exits the event handler. 그런 다음 RetrieveFeedAsync 가 비동기적으로 실행 되는 동안 다른 이벤트를 처리할 수 있습니다.Then it can process other events while RetrieveFeedAsync executes asynchronously. 따라서 앱이 사용자에게 응답 가능한 상태를 유지하게 됩니다.This keeps the app responsive to the user. RetrieveFeedAsync 가 완료 되 고 SyndicationFeed 를 사용할 수 있게 되 면 응용 프로그램은 기본적으로 이벤트 처리기를 후 하 SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) 고 나머지 메서드는 종료 합니다.When RetrieveFeedAsync completes and the SyndicationFeed is available, the app essentially reenters the event handler where it left off, after SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), and finishes the rest of the method.

Wait 연산자를 사용 하는 것은 코드가 허수 메서드를 사용 했을 때 코드의 모양과 크게 다르지 않는다는 점입니다 RetrieveFeed .The nice thing about using the await operator is that the code doesn't look much different from how the code looks if you used the imaginary RetrieveFeed method. Wait 연산자 없이 c # 또는 Visual Basic로 비동기 코드를 작성 하는 방법이 있지만 결과 코드는 비동기식으로 실행 되는 메커니즘을 강조 하는 경향이 있습니다.There are ways to write asynchronous code in C# or Visual Basic without the await operator, but the resulting code tends to emphasize the mechanics of executing asynchronously. 이렇게 하면 비동기 코드를 작성 하 고 이해 하기 어렵고 유지 관리 하기 어려울 수 있습니다.This makes asynchronous code hard to write, hard to understand, and hard to maintain. Wait 연산자를 사용 하 여 코드를 복잡 하 게 만들지 않고 비동기 앱의 이점을 얻을 수 있습니다.By using the await operator, you get the benefits of an asynchronous app without making your code complex.

비동기 Api의 반환 형식 및 결과Return types and results of asynchronous APIs

RetrieveFeedAsync에 대 한 링크를 팔 로우 하는 경우 RetrieveFeedAsync 의 반환 형식이 SyndicationFeed가 아닌 것을 알 수 있습니다.If you followed the link to RetrieveFeedAsync, you might have noticed that the return type of RetrieveFeedAsync is not a SyndicationFeed. 대신 반환 형식은 IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress> 입니다.Instead, the return type is IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress>. 비동기 API는 원시 구문에서 볼 때 그 안에 결과를 포함 하는 개체를 반환 합니다.Viewed from the raw syntax, an asynchronous API returns an object that contains the result within it. 일반적이 고 때로는 비동기 메서드를 대기 가능 하는 것으로 생각 하는 것이 일반적 이지만 wait 연산자는 메서드가 아닌 메서드의 반환 값에 대해 실제로 작동 합니다.While it is common, and sometimes useful, to think of an asynchronous method as being awaitable, the await operator actually operates on the method’s return value, not on the method. Wait 연산자를 적용 하면 메서드에서 반환 하는 개체에 대해 getresult 를 호출한 결과가 반환 됩니다.When you apply the await operator, what you get back is the result of calling GetResult on the object returned by the method. 이 예에서 SyndicationFeedRetrieveFeedAsync () 의 결과입니다.In the example, the SyndicationFeed is the result of RetrieveFeedAsync.GetResult().

비동기 메서드를 사용 하는 경우 시그니처를 검사 하 여 메서드에서 반환 된 값을 대기 한 후에 다시 가져올 항목을 확인할 수 있습니다.When you use an asynchronous method, you can examine the signature to see what you’ll get back after awaiting the value returned from the method. UWP의 모든 비동기 Api는 다음 형식 중 하나를 반환 합니다.All asynchronous APIs in the UWP return one of the following types:

비동기 메서드의 결과 형식은 TResult 형식 매개 변수와 같습니다.The result type of an asynchronous method is the same as the TResult type parameter. 가 없는 형식에는 TResult 결과가 없습니다.Types without a TResult don't have a result. 결과를 void로 간주할 수 있습니다.You can think of the result as being void. Visual Basic에서 Sub 프로시저는 void 반환 형식을 사용 하는 메서드와 동일 합니다.In Visual Basic, a Sub procedure is equivalent to a method with a void return type.

다음 표에서는 비동기 메서드의 예제를 제공 하 고 각각의 반환 형식 및 결과 형식을 나열 합니다.The table here gives examples of asynchronous methods and lists the return type and result type of each.

비동기 메서드Asynchronous method 반환 형식Return type 결과 형식Result type
SyndicationClient. RetrieveFeedAsyncSyndicationClient.RetrieveFeedAsync IAsyncOperationWithProgress < SyndicationFeed, RetrievalProgress>IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress> SyndicationFeedSyndicationFeed
FileOpenPicker. PickSingleFileAsyncFileOpenPicker.PickSingleFileAsync Iasyncoperation < StorageFile>IAsyncOperation<StorageFile> StorageFileStorageFile
XmlDocument SaveToFileAsyncXmlDocument.SaveToFileAsync IAsyncActionIAsyncAction voidvoid
InkStrokeContainer. LoadAsyncInkStrokeContainer.LoadAsync IAsyncActionWithProgress < UInt64>IAsyncActionWithProgress<UInt64> voidvoid
DataReader. LoadAsyncDataReader.LoadAsync **Iasyncoperation < UInt32 > ** 를 구현 하는 사용자 지정 결과 클래스인 datareaderloadoperationDataReaderLoadOperation, a custom results class that implements IAsyncOperation<UInt32> UInt32UInt32

 

UWP 앱 용 .net 에 정의 된 비동기 메서드에는 반환 형식 작업 또는 **작업 < TResult > **가 있습니다.Asynchronous methods that are defined in .NET for UWP apps have the return type Task or Task<TResult>. 작업 을 반환 하는 메서드는 iasyncaction을 반환 하는 UWP의 비동기 메서드와 유사 합니다.Methods that return Task are similar to the asynchronous methods in the UWP that return IAsyncAction. 각 경우에서 비동기 메서드의 결과는 void입니다.In each case, the result of the asynchronous method is void. 반환 형식 **작업 < Tresult > ** 은 **iasyncoperation < TResult > ** 와 비슷하며, 작업을 실행 하는 경우 비동기 메서드의 결과가 TResult 형식 매개 변수와 동일한 형식입니다.The return type Task<TResult> is similar to IAsyncOperation<TResult> in that the result of the asynchronous method when running the task is the same type as the TResult type parameter. UWP 앱 및 작업에 .net 을 사용 하는 방법에 대 한 자세한 내용은 Windows 런타임 앱에 대 한 .net 개요를 참조 하세요.For more info about using .NET for UWP apps and tasks, see .NET for Windows Runtime apps overview.

오류 처리Handling errors

Wait 연산자를 사용 하 여 비동기 메서드에서 결과를 검색 하는 경우에는 동기 메서드와 마찬가지로 try/catch 블록을 사용 하 여 비동기 메서드에서 발생 하는 오류를 처리할 수 있습니다.When you use the await operator to retrieve your results from an asynchronous method, you can use a try/catch block to handle errors that occur in asynchronous methods, just as you do for synchronous methods. 이전 예제에서는 RetrieveFeedAsync 메서드를 래핑하고 try/catch 블록에서 작업을 대기 하 여 예외가 throw 될 때 오류를 처리 합니다.The previous example wraps the RetrieveFeedAsync method and await operation in a try/catch block to handle errors when an exception is thrown.

비동기 메서드가 다른 비동기 메서드를 호출할 때 예외가 발생 하는 비동기 메서드는 외부 메서드에 전파 됩니다.When asynchronous methods call other asynchronous methods, any asynchronous method that results in an exception will be propagated to the outer methods. 즉, 가장 바깥쪽 메서드에 try/catch 블록을 추가 하 여 중첩 된 비동기 메서드에 대 한 오류를 catch 할 수 있습니다.This means that you can put a try/catch block on the outer-most method to catch errors for the nested asynchronous methods. 이는 동기 메서드에 대 한 예외를 catch 하는 방법과 비슷합니다.Again, this is similar to how you catch exceptions for synchronous methods. 그러나 catch 블록에는 wait 를 사용할 수 없습니다.However, you can't use await in the catch block.

   Microsoft Visual Studio 2005의 c # 부터는 catch 블록에서 wait 를 사용할 수 있습니다.Tip  Starting with C# in Microsoft Visual Studio 2005, you can use await in the catch block.

요약 및 다음 단계Summary and next steps

여기에 표시 된 비동기 메서드를 호출 하는 패턴은 이벤트 처리기에서 비동기 Api를 호출할 때 사용할 수 있는 가장 간단한 방법입니다.The pattern of calling an asynchronous method that we show here is the simplest one to use when you call asynchronous APIs in an event handler. Void 를 반환 하는 재정의 된 메서드 또는 Visual Basic의 Sub 에서 비동기 메서드를 호출 하는 경우에도이 패턴을 사용할 수 있습니다.You can also use this pattern when you call an asynchronous method in an overridden method that returns void or a Sub in Visual Basic.

UWP에서 비동기 메서드를 사용할 때는 다음을 기억해 야 합니다.As you encounter asynchronous methods in the UWP, it is important to remember:

  • 규칙에 따라 비동기 메서드에는 "Async"로 끝나는 이름이 지정 됩니다.By convention, asynchronous methods are given names that end in "Async".
  • Wait 연산자를 사용 하는 모든 메서드에는 async 키워드로 표시 된 선언이 있어야 합니다.Any method that uses the await operator must have its declaration marked with the async keyword.
  • 앱이 wait 연산자를 찾으면 비동기 메서드가 실행 되는 동안 앱은 사용자 상호 작용에 응답 하는 상태로 유지 됩니다.When an app finds the await operator, the app remains responsive to user interaction while the asynchronous method executes.
  • 비동기 메서드에서 반환 된 값을 대기 하면 결과가 포함 된 개체를 반환 합니다.Awaiting the value returned by an asynchronous method returns an object that contains the result. 대부분의 경우 반환 값에 포함 된 결과는 반환 값 자체가 아니라 유용 합니다.In most cases, the result contained within the return value is what's useful, not the return value itself. 비동기 메서드의 반환 형식을 살펴보면 결과 내에 포함 된 값의 형식을 찾을 수 있습니다.You can find the type of the value that is contained inside the result by looking at the return type of the async method.
  • 비동기 Api와 비동기 패턴을 사용 하는 것은 종종 응용 프로그램의 응답성을 향상 시키는 방법입니다.Using asynchronous APIs and async patterns is often a way to improve the responsiveness of your app.

이 항목의 예제에서는 다음과 같은 텍스트를 출력 합니다.The example in this topic outputs text that looks like this.

Windows Experience Blog
PC Snapshot: Sony VAIO Y, 8/9/2011 10:26:56 AM -07:00
Tech Tuesday Live Twitter #Chat: Too Much Tech #win7tech, 8/8/2011 12:48:26 PM -07:00
Windows 7 themes: what’s new and what’s popular!, 8/4/2011 11:56:28 AM -07:00
PC Snapshot: Toshiba Satellite A665 3D, 8/2/2011 8:59:15 AM -07:00
Time for new school supplies? Find back-to-school deals on Windows 7 PCs and Office 2010, 8/1/2011 2:14:40 PM -07:00
Best PCs for blogging (or working) on the go, 8/1/2011 10:08:14 AM -07:00
Tech Tuesday – Blogging Tips and Tricks–#win7tech, 8/1/2011 9:35:54 AM -07:00
PC Snapshot: Lenovo IdeaPad U460, 7/29/2011 9:23:05 AM -07:00
GIVEAWAY: Survive BlogHer with a Sony VAIO SA and a Samsung Focus, 7/28/2011 7:27:14 AM -07:00
3 Ways to Stay Cool This Summer, 7/26/2011 4:58:23 PM -07:00
Getting RAW support in Photo Gallery & Windows 7 (…and a contest!), 7/26/2011 10:40:51 AM -07:00
Tech Tuesdays Live Twitter Chats: Photography Tips, Tricks and Essentials, 7/25/2011 12:33:06 PM -07:00
3 Tips to Go Green With Your PC, 7/22/2011 9:19:43 AM -07:00
How to: Buy a Green PC, 7/22/2011 9:13:22 AM -07:00
Windows 7 themes: the distinctive artwork of Cheng Ling, 7/20/2011 9:53:07 AM -07:00