다음을 통해 공유


방법: 병렬로 여러 웹 요청 만들기(C# 및 Visual Basic)

만들 때 비동기 메서드에서 작업 시작 됩니다.Await (Visual Basic) 또는 기다립니다 (C#) 운영자 작업 지점에 없는 처리 없습니다 계속 작업이 완료 될 때까지 메서드를 적용 합니다.대개는 다음 예제와 같이 작성 하는 즉시 작업 갖입니다.

Dim result = Await someWebAccessMethodAsync(url)
var result = await someWebAccessMethodAsync(url);

그러나 작업의 완료에 의존 하지 않는 프로그램 다른 작업을 수행할 수 없는 경우 대기 작업에서 작업 만들기를 구분할 수 있습니다.

' The following line creates and starts the task.
Dim myTask = someWebAccessMethodAsync(url)

' While the task is running, you can do other work that does not depend
' on the results of the task.
' . . . . .

' The application of Await suspends the rest of this method until the task is 
' complete.
Dim result = Await myTask
// The following line creates and starts the task.
var myTask = someWebAccessMethodAsync(url);

// While the task is running, you can do other work that doesn't depend
// on the results of the task.
// . . . . .

// The application of await suspends the rest of this method until the task is complete.
var result = await myTask;

작업 시작 사이의 대기 하 고, 다른 작업을 시작할 수 있습니다.암시적으로 다른 작업을 동시에 실행할 추가 스레드는 생성 됩니다.

다음 프로그램 세 가지 비동기 웹 다운로드를 시작 하 고 순서 대로 호출 하 고 기다리고 있다.알림 작업 항상 만든 갖 하 고 하는 순서 대로 완료 하지 않는 프로그램을 실행할 때.작성 중인 메서드 await 식에 도달 하기 전에 하나 이상의 작업 완료 될 수 있습니다 때 실행 시작 합니다.

동시에 여러 작업을 시작 하는 다른 예제를 보려면 방법: Task.WhenAll을 사용하여 연습 확장(C# 및 Visual Basic).

이 프로젝트를 완료 하려면 있어야 Visual Studio 2012 컴퓨터에 설치 합니다.자세한 정보는 Microsoft website에 나와 있다.

이 예제에서 코드를 다운로드할 수 있습니다 코드 샘플 개발자.

프로젝트를 설정하려면

  • WPF 응용 프로그램을 설정 하려면 다음 단계를 완료 합니다.이러한 단계에 대 한 자세한 정보를 찾을 수 있습니다 연습: Async 및 Await를 사용하여 웹에 액세스(C# 및 Visual Basic).

    • 텍스트 상자와 단추가 포함 된 WPF 응용 프로그램을 만듭니다.단추의 이름을 startButton, 및 텍스트 상자의 이름을 resultsTextBox.

    • 에 대 한 참조를 추가 합니다. System.Net.Http.

    • MainWindow.xaml.vb 또는 Mainwindow.xaml.cs에 추가 된 Imports 문 또는 using 지시문에 대 한 System.Net.Http.

코드를 추가 하려면

  1. 디자인 창에서 Mainwindow.xaml를 만들려면 단추를 두 번의 startButton_Click MainWindow.xaml.vb 또는 MainWindow.xaml.cs 이벤트 처리기입니다.단추를 선택 하 고 선택한는 선택한 요소에 대 한 이벤트 처리기 아이콘에는 속성 창에서 다음 입력 startButton_Click 에 클릭 텍스트 상자.

  2. 다음 코드를 복사 하 여 본문에 붙여 startButton_Click MainWindow.xaml.vb 또는 MainWindow.xaml.cs.

    resultsTextBox.Clear()
    Await CreateMultipleTasksAsync()
    resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
    
    resultsTextBox.Clear();
    await CreateMultipleTasksAsync();
    resultsTextBox.Text += "\r\n\r\nControl returned to startButton_Click.\r\n";
    

    비동기 메서드를 호출 하는 코드 CreateMultipleTasksAsync, 응용 프로그램은 드라이브.

  3. 다음 지원 방법은 프로젝트에 추가 합니다.

    • ProcessURLAsync사용 하는 HttpClient 바이트 배열로 웹 사이트의 내용을 다운로드 하는 메서드.지원 메서드 ProcessURLAsync 다음 표시 하 고 배열의 길이 반환 합니다.

    • DisplayResults바이트 수가 바이트 배열에서 각 URL을 표시합니다.이 표시 표시 각 작업 다운로드 완료 되 면.

    다음을 복사 하 여 다음의 startButton_Click MainWindow.xaml.vb 또는 MainWindow.xaml.cs 이벤트 처리기입니다.

    Private Async Function ProcessURLAsync(url As String, client As HttpClient) As Task(Of Integer)
    
        Dim byteArray = Await client.GetByteArrayAsync(url)
        DisplayResults(url, byteArray)
        Return byteArray.Length
    End Function
    
    
    Private Sub DisplayResults(url As String, content As Byte())
    
        ' Display the length of each website. The string format 
        ' is designed to be used with a monospaced font, such as
        ' Lucida Console or Global Monospace.
        Dim bytes = content.Length
        ' Strip off the "http://".
        Dim displayURL = url.Replace("http://", "")
        resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes)
    End Sub
    
    async Task<int> ProcessURLAsync(string url, HttpClient client)
    {
        var byteArray = await client.GetByteArrayAsync(url);
        DisplayResults(url, byteArray);
        return byteArray.Length;
    }
    
    
    private void DisplayResults(string url, byte[] content)
    {
        // Display the length of each website. The string format 
        // is designed to be used with a monospaced font, such as
        // Lucida Console or Global Monospace.
        var bytes = content.Length;
        // Strip off the "http://".
        var displayURL = url.Replace("http://", "");
        resultsTextBox.Text += string.Format("\n{0,-58} {1,8}", displayURL, bytes);
    }
    
  4. 마지막으로 메서드 정의 CreateMultipleTasksAsync, 다음 단계를 수행 합니다.

    • 메서드 선언에 HttpClient 메서드에 액세스 해야 하는 개체를 GetByteArrayAsync 에서 ProcessURLAsync.

    • 이 메서드를 만든 다음 형식의 세 가지 작업을 시작 Task<TResult>여기서 TResult 정수입니다.각 작업이 완료 되 면 DisplayResults 작업의 URL 및 다운로드 한 내용의 길이 표시 합니다.비동기적으로 실행 하는 작업 때문에 결과가 나타나는 순서는 선언 된 순서에서 달라질 수 있습니다.

    • 메서드는 각 작업의 완료를 기다리고 있다.각 Await 또는 await 연산자의 실행을 일시 중지 CreateMultipleTasksAsync 바뀌게 하는 작업을 완료 합니다.운영자 또한 반환 값을 호출에서 검색 ProcessURLAsync 에서 완료 된 각 작업.

    • 작업을 완료 하 고 정수 값을 읽어들인 경우 메서드 길이 웹 사이트의 합계를 계산 하 고 결과 표시 합니다.

    다음 메서드를 복사 하 고 솔루션에 붙여 넣습니다.

    Private Async Function CreateMultipleTasksAsync() As Task
    
        ' Declare an HttpClient object, and increase the buffer size. The
        ' default buffer size is 65,536.
        Dim client As HttpClient =
            New HttpClient() With {.MaxResponseContentBufferSize = 1000000}
    
        ' Create and start the tasks. As each task finishes, DisplayResults 
        ' displays its length.
        Dim download1 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com", client)
        Dim download2 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com/en-us/library/hh156528(VS.110).aspx", client)
        Dim download3 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com/en-us/library/67w7t67f.aspx", client)
    
        ' Await each task.
        Dim length1 As Integer = Await download1
        Dim length2 As Integer = Await download2
        Dim length3 As Integer = Await download3
    
        Dim total As Integer = length1 + length2 + length3
    
        ' Display the total count for all of the websites.
        resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
                                             "Total bytes returned:  {0}" & vbCrLf, total)
    End Function
    
    private async Task CreateMultipleTasksAsync()
    {
        // Declare an HttpClient object, and increase the buffer size. The
        // default buffer size is 65,536.
        HttpClient client =
            new HttpClient() { MaxResponseContentBufferSize = 1000000 };
    
        // Create and start the tasks. As each task finishes, DisplayResults 
        // displays its length.
        Task<int> download1 = 
            ProcessURLAsync("https://msdn.microsoft.com", client);
        Task<int> download2 = 
            ProcessURLAsync("https://msdn.microsoft.com/en-us/library/hh156528(VS.110).aspx", client);
        Task<int> download3 = 
            ProcessURLAsync("https://msdn.microsoft.com/en-us/library/67w7t67f.aspx", client);
    
        // Await each task.
        int length1 = await download1;
        int length2 = await download2;
        int length3 = await download3;
    
        int total = length1 + length2 + length3;
    
        // Display the total count for the downloaded websites.
        resultsTextBox.Text +=
            string.Format("\r\n\r\nTotal bytes returned:  {0}\r\n", total);
    }
    
  5. 프로그램을 실행 한 다음 선택 합니다 F5 키를 선택 하 여 시작 단추.

    프로그램을 여러 번 실행 하 여 항상 같은 순서로 세 작업 끝나고 하지 반드시 순서에 완료 순서 작성 갖 하 고는 아님을 확인 합니다.

예제

다음 코드에는 전체 예제가 포함되어 있습니다.

' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http


Class MainWindow

    Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
        resultsTextBox.Clear()
        Await CreateMultipleTasksAsync()
        resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
    End Sub


    Private Async Function CreateMultipleTasksAsync() As Task

        ' Declare an HttpClient object, and increase the buffer size. The
        ' default buffer size is 65,536.
        Dim client As HttpClient =
            New HttpClient() With {.MaxResponseContentBufferSize = 1000000}

        ' Create and start the tasks. As each task finishes, DisplayResults 
        ' displays its length.
        Dim download1 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com", client)
        Dim download2 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com/en-us/library/hh156528(VS.110).aspx", client)
        Dim download3 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com/en-us/library/67w7t67f.aspx", client)

        ' Await each task.
        Dim length1 As Integer = Await download1
        Dim length2 As Integer = Await download2
        Dim length3 As Integer = Await download3

        Dim total As Integer = length1 + length2 + length3

        ' Display the total count for all of the websites.
        resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
                                             "Total bytes returned:  {0}" & vbCrLf, total)
    End Function


    Private Async Function ProcessURLAsync(url As String, client As HttpClient) As Task(Of Integer)

        Dim byteArray = Await client.GetByteArrayAsync(url)
        DisplayResults(url, byteArray)
        Return byteArray.Length
    End Function


    Private Sub DisplayResults(url As String, content As Byte())

        ' Display the length of each website. The string format 
        ' is designed to be used with a monospaced font, such as
        ' Lucida Console or Global Monospace.
        Dim bytes = content.Length
        ' Strip off the "http://".
        Dim displayURL = url.Replace("http://", "")
        resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes)
    End Sub
End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

// Add the following using directive, and add a reference for System.Net.Http.
using System.Net.Http;


namespace AsyncExample_MultipleTasks
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void startButton_Click(object sender, RoutedEventArgs e)
        {
            resultsTextBox.Clear();
            await CreateMultipleTasksAsync();
            resultsTextBox.Text += "\r\n\r\nControl returned to startButton_Click.\r\n";
        }


        private async Task CreateMultipleTasksAsync()
        {
            // Declare an HttpClient object, and increase the buffer size. The
            // default buffer size is 65,536.
            HttpClient client =
                new HttpClient() { MaxResponseContentBufferSize = 1000000 };

            // Create and start the tasks. As each task finishes, DisplayResults 
            // displays its length.
            Task<int> download1 = 
                ProcessURLAsync("https://msdn.microsoft.com", client);
            Task<int> download2 = 
                ProcessURLAsync("https://msdn.microsoft.com/en-us/library/hh156528(VS.110).aspx", client);
            Task<int> download3 = 
                ProcessURLAsync("https://msdn.microsoft.com/en-us/library/67w7t67f.aspx", client);

            // Await each task.
            int length1 = await download1;
            int length2 = await download2;
            int length3 = await download3;

            int total = length1 + length2 + length3;

            // Display the total count for the downloaded websites.
            resultsTextBox.Text +=
                string.Format("\r\n\r\nTotal bytes returned:  {0}\r\n", total);
        }


        async Task<int> ProcessURLAsync(string url, HttpClient client)
        {
            var byteArray = await client.GetByteArrayAsync(url);
            DisplayResults(url, byteArray);
            return byteArray.Length;
        }


        private void DisplayResults(string url, byte[] content)
        {
            // Display the length of each website. The string format 
            // is designed to be used with a monospaced font, such as
            // Lucida Console or Global Monospace.
            var bytes = content.Length;
            // Strip off the "http://".
            var displayURL = url.Replace("http://", "");
            resultsTextBox.Text += string.Format("\n{0,-58} {1,8}", displayURL, bytes);
        }
    }
}

참고 항목

작업

연습: Async 및 Await를 사용하여 웹에 액세스(C# 및 Visual Basic)

방법: Task.WhenAll을 사용하여 연습 확장(C# 및 Visual Basic)

개념

Async 및 Await를 사용한 비동기 프로그래밍(C# 및 Visual Basic)