다음을 통해 공유


비동기 반환 형식(C# 및 Visual Basic)

비동기 메서드가 있는 세 개의 가능한 반환 형식: Task<TResult>, Task, 및 void입니다.Visual Basic void 반환 형식을 작성 되는 Sub 프로시저.비동기 메서드에 대 한 자세한 내용은 Async 및 Await를 사용한 비동기 프로그래밍(C# 및 Visual Basic).

다음 섹션 중 하나에서 각 반환 형식 검사 및 모든 세 가지 종류의 항목의 끝에 사용 하는 전체 예제를 찾을 수 있습니다.

[!참고]

예제를 실행 하려면 Visual Studio 2012 년까지 있어야 익스프레스 Visual Studio 2012 Windows 데스크톱에 대 한, 또는 컴퓨터에 설치 된.NET Framework 4.5.

이 항목에는 다음 단원이 포함되어 있습니다.

  • Task(t)의 반환 형식
  • 작업 반환 형식
  • Void 반환 형식
  • 완성된 예제
  • 관련 항목

Task(t)의 반환 형식

Task<TResult> 반환 형식을 포함 하는 비동기 메서드를 사용을 반환 (Visual Basic) 또는 반환 피연산자에 형식이 문 (C#) TResult.

다음 예제에서는 TaskOfT_MethodAsync 비동기 메서드는 정수를 반환 하는 return 문이 포함 되어 있습니다.따라서 메서드 선언에 반환 형식으로 지정 해야 Task(Of Integer) Visual Basic 또는 Task<int> C#에 있습니다.

' TASK(OF T) EXAMPLE
Async Function TaskOfT_MethodAsync() As Task(Of Integer)

    ' The body of an async method is expected to contain an awaited 
    ' asynchronous call.
    ' Task.FromResult is a placeholder for actual work that returns a string.
    Dim today As String = Await Task.FromResult(Of String)(DateTime.Now.DayOfWeek.ToString())

    ' The method then can process the result in some way.
    Dim leisureHours As Integer
    If today.First() = "S" Then
        leisureHours = 16
    Else
        leisureHours = 5
    End If

    ' Because the return statement specifies an operand of type Integer, the 
    ' method must have a return type of Task(Of Integer). 
    Return leisureHours
End Function
// TASK<T> EXAMPLE
async Task<int> TaskOfT_MethodAsync()
{
    // The body of the method is expected to contain an awaited asynchronous
    // call.
    // Task.FromResult is a placeholder for actual work that returns a string.
    var today = await Task.FromResult<string>(DateTime.Now.DayOfWeek.ToString());

    // The method then can process the result in some way.
    int leisureHours;
    if (today.First() == 'S')
        leisureHours = 16;
    else
        leisureHours = 5;

    // Because the return statement specifies an operand of type int, the
    // method must have a return type of Task<int>.
    return leisureHours;
}

때 TaskOfT_MethodAsync 라고 await 식 내 await 식 정수 값을 검색 (값을 leisureHours)에서 반환 하는 작업에 저장 된 TaskOfT_MethodAsync.에 대 한 자세한 내용은 식 기다립니다 보려면 Await 연산자(Visual Basic) 또는 await(C# 참조).

다음 코드를 호출 하 고 메서드를 잠그고 TaskOfT_MethodAsync.결과에 할당 되는 result1 변수입니다.

' Call and await the Task(Of T)-returning async method in the same statement.
Dim result1 As Integer = Await TaskOfT_MethodAsync()
// Call and await the Task<T>-returning async method in the same statement.
int result1 = await TaskOfT_MethodAsync();

호출을 구분 하 여 어떻게 발생 하는지 더 잘 이해할 수 있습니다 TaskOfT_MethodAsync 응용 프로그램에서 Await 또는 await, 다음 코드를 보여 줍니다.메서드를 호출 하면 TaskOfT_MethodAsync 에서는 바뀌게 즉시 반환 하지 않습니다는 Task(Of Integer) 또는 Task<int>, 메서드의 선언에서 예상 대로.작업에 할당 되는 integerTask 변수 예제에서.때문에 integerTask 되는 Task<TResult>, 포함 한 Result 형식의 속성을 TResult.이 경우 TResult 정수 형식을 나타냅니다.때 Await 또는 await 적용 되어 integerTask, await 식이의 내용에는 Result 속성을 integerTask.값에 할당 되는 result2 변수입니다.

주의 정보주의

Result 는 차단 속성입니다.해당 작업을 완료 하기 전에 액세스 하려고 하는 경우 현재 활성 상태인 스레드 작업이 완료 되 고 값이 사용할 수 있는 때까지 차단 됩니다.사용 하 여 값 액세스 해야 하는 대부분의 경우 Await 또는 await 속성에 직접 액세스 하지 않고.

' Call and await in separate statements.
Dim integerTask As Task(Of Integer) = TaskOfT_MethodAsync()

' You can do other work that does not rely on resultTask before awaiting.
textBox1.Text &= String.Format("Application can continue working while the Task(Of T) runs. . . . " & vbCrLf)

Dim result2 As Integer = Await integerTask
// Call and await in separate statements.
Task<int> integerTask = TaskOfT_MethodAsync();

// You can do other work that does not rely on integerTask before awaiting.
textBox1.Text += String.Format("Application can continue working while the Task<T> runs. . . . \r\n");

int result2 = await integerTask;

표시 문을 다음 코드에서 확인 값의 result1 변수는 result2 변수 및 Result 속성이 동일.기억의 Result 속성이 차단 되 고 해당 작업 갖 되었습니다 전에 액세스 해서는 안 되.

' Display the values of the result1 variable, the result2 variable, and
' the resultTask.Result property.
textBox1.Text &= String.Format(vbCrLf & "Value of result1 variable:   {0}" & vbCrLf, result1)
textBox1.Text &= String.Format("Value of result2 variable:   {0}" & vbCrLf, result2)
textBox1.Text &= String.Format("Value of resultTask.Result:  {0}" & vbCrLf, integerTask.Result)
// Display the values of the result1 variable, the result2 variable, and
// the integerTask.Result property.
textBox1.Text += String.Format("\r\nValue of result1 variable:   {0}\r\n", result1);
textBox1.Text += String.Format("Value of result2 variable:   {0}\r\n", result2);
textBox1.Text += String.Format("Value of integerTask.Result: {0}\r\n", integerTask.Result);

작업 반환 형식

Return 문을 포함 하지 않는 또는 피연산자를 반환 하지 않습니다 일반적으로 return 문이 포함 된 비동기 메서드 반환 형식이 있는 Task.이러한 메서드는 void를 반환 될 것 메서드 (Sub Visual Basic 프로시저) 동기적으로 실행 하도록 작성 된 경우.사용 하는 경우는 Task 는 비동기 메서드를 호출 하는 메서드를 반환 형식이 호출된 비동기 메서드가 완료 될 때까지 호출자의 완성을 일시 중단 하는 await 연산자 사용할 수 있습니다.

다음 예제에서는 비동기 메서드를 Task_MethodAsync return 문이 포함 되지 않습니다.따라서 반환 유형을 지정 Task 에 대 한 메서드를 통해 Task_MethodAsync 갖 수 합니다.정의 Task 형식 등 포함 되지 않습니다는 Result 속성의 반환 값을 저장 합니다.

' TASK EXAMPLE
Async Function Task_MethodAsync() As Task

    ' The body of an async method is expected to contain an awaited 
    ' asynchronous call.
    ' Task.Delay is a placeholder for actual work.
    Await Task.Delay(2000)
    textBox1.Text &= String.Format(vbCrLf & "Sorry for the delay. . . ." & vbCrLf)

    ' This method has no return statement, so its return type is Task. 
End Function
// TASK EXAMPLE
async Task Task_MethodAsync()
{
    // The body of an async method is expected to contain an awaited 
    // asynchronous call.
    // Task.Delay is a placeholder for actual work.
    await Task.Delay(2000);
    // Task.Delay delays the following line by two seconds.
    textBox1.Text += String.Format("\r\nSorry for the delay. . . .\r\n");

    // This method has no return statement, so its return type is Task.  
}

Task_MethodAsync호출 되 고 갖는 await 문 동기에 대 한 호출 문을 유사한 await 식 대신 사용 하 여 Sub 또는 메서드가 void를 반환 합니다.Await 연산자의 값이 경우 작성할 수 없습니다.

다음 코드를 호출 하 고 메서드를 잠그고 Task_MethodAsync.

' Call and await the Task-returning async method in the same statement.
Await Task_MethodAsync()
// Call and await the Task-returning async method in the same statement.
await Task_MethodAsync();

이전 처럼 Task<TResult> 예를 들어, 호출을 구분할 수 있습니다 Task_MethodAsync await 연산자의 응용 프로그램에서 다음 코드를 보여 줍니다.그러나 기억는 Task 없는 Result 속성 및 await 연산자에 적용 될 때 값이 생성 되는 Task.

다음 코드 호출 구분 Task_MethodAsync 작업 대기 중에서 Task_MethodAsync 반환 합니다.

' Call and await in separate statements.
Dim simpleTask As Task = Task_MethodAsync()

' You can do other work that does not rely on simpleTask before awaiting.
textBox1.Text &= String.Format(vbCrLf & "Application can continue working while the Task runs. . . ." & vbCrLf)

Await simpleTask
// Call and await in separate statements.
Task simpleTask = Task_MethodAsync();

// You can do other work that does not rely on simpleTask before awaiting.
textBox1.Text += String.Format("\r\nApplication can continue working while the Task runs. . . .\r\n");

await simpleTask;

Void 반환 형식

Void 반환 형식이 기본 사용 (Sub Visual Basic 프로시저) void 반환 형식이 필요 이벤트 처리기입니다.Void를 반환 하는 메서드를 재정의 하는 void 반환을 사용 하거나 분류 하는 작업을 수행 하는 방법에 대 한 as "실행 후 제거 합니다." 그러나 반환 해야는 Task 가능한 경우 void를 반환 하는 비동기 메서드를 갖 수 있기 때문에.이러한 메서드의 모든 호출자를 완료 하려면 호출된 하는 비동기 메서드를 기다리지 않고 완료 될 때까지 계속 있어야 및 호출자에 게 값 또는 비동기 메서드를 생성 하는 예외에 대해 독립적 이어야 합니다.

Void를 반환 하는 비동기 메서드 호출자는 메서드에서 throw 되는 예외를 catch 할 수 없습니다 하 고 이러한 처리 되지 않은 예외가 응용 프로그램이 실패할 수 발생할 수 있습니다.예외가 반환 하는 비동기 메서드를 발생 하는 경우는 Task 또는 Task<TResult>, 예외에서 반환 된 작업, 저장 되 고 작업을 갖 때 다시 throw 합니다.따라서 예외를 생성할 수 있는 모든 비동기 메서드 반환 형식이 있는지를 확인 Task 또는 Task<TResult> 및 메서드에 대 한 호출은 갖 됩니다.

Async 메서드에서 예외를 catch 하는 방법에 대 한 자세한 내용은 try-catch(C# 참조) 또는 Try...Catch...Finally 문(Visual Basic).

비동기 이벤트 처리기에 다음 코드를 정의합니다.

' SUB EXAMPLE
Async Sub button1_Click(sender As Object, e As RoutedEventArgs) Handles button1.Click

    textBox1.Clear()

    ' Start the process and await its completion. DriverAsync is a 
    ' Task-returning async method.
    Await DriverAsync()

    ' Say goodbye.
    textBox1.Text &= vbCrLf & "All done, exiting button-click event handler."
End Sub
// VOID EXAMPLE
private async void button1_Click(object sender, RoutedEventArgs e)
{
    textBox1.Clear();

    // Start the process and await its completion. DriverAsync is a 
    // Task-returning async method.
    await DriverAsync();

    // Say goodbye.
    textBox1.Text += "\r\nAll done, exiting button-click event handler.";
}

완성된 예제

다음 Windows Presentation Foundation (WPF) 프로젝트에서이 항목의 코드 예제를 포함합니다.

프로젝트를 실행 하려면 다음 단계를 수행 하십시오.

  1. Visual Studio를 시작합니다.

  2. 메뉴 모음에서 파일, 새로 만들기, 프로젝트를 선택합니다.

    새 프로젝트 대화 상자가 열립니다.

  3. 설치 된, 템플릿 범주 선택 Visual Basic 또는 C#, 다음 선택 Windows.선택 WPF 응용 프로그램 프로젝트 형식 목록에서.

  4. 입력 AsyncReturnTypes 프로젝트의 이름으로 하 고 선택 된 확인 단추.

    솔루션 탐색기에 새 프로젝트가 나타납니다.

  5. Visual Studio 코드 편집기에서 선택 된 MainWindow.xaml 탭.

    탭이 표시 되 면 Mainwindow.xaml에 대 한 바로 가기 메뉴 열기 솔루션 탐색기, 다음을 선택 하 고 열기.

  6. XAML MainWindow.xaml, 창 코드를 다음 코드로 대체 합니다.

    <Window x:Class="MainWindow"
            xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button x:Name="button1" Content="Start" HorizontalAlignment="Left" Margin="214,28,0,0" VerticalAlignment="Top" Width="75" HorizontalContentAlignment="Center" FontWeight="Bold" FontFamily="Aharoni" Click="button1_Click"/>
            <TextBox x:Name="textBox1" Margin="0,80,0,0" TextWrapping="Wrap" FontFamily="Lucida Console"/>
    
        </Grid>
    </Window>
    
    <Window x:Class="AsyncReturnTypes.MainWindow"
            xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button x:Name="button1" Content="Start" HorizontalAlignment="Left" Margin="214,28,0,0" VerticalAlignment="Top" Width="75" HorizontalContentAlignment="Center" FontWeight="Bold" FontFamily="Aharoni" Click="button1_Click"/>
            <TextBox x:Name="textBox1" Margin="0,80,0,0" TextWrapping="Wrap" FontFamily="Lucida Console"/>
    
        </Grid>
    </Window>
    

    텍스트 상자와 단추가 포함 된 간단한 창이 표시 된 디자인 Mainwindow.xaml의 창.

  7. 솔루션 탐색기, MainWindow.xaml.vb 또는 Mainwindow.xaml.cs에 대 한 바로 가기 메뉴를 엽니다 및 다음 선택 코드 보기.

  8. MainWindow.xaml.vb 또는 Mainwindow.xaml.cs의 코드를 다음 코드로 대체 합니다.

    Class MainWindow
    
        ' SUB EXAMPLE
        Async Sub button1_Click(sender As Object, e As RoutedEventArgs) Handles button1.Click
    
            textBox1.Clear()
    
            ' Start the process and await its completion. DriverAsync is a 
            ' Task-returning async method.
            Await DriverAsync()
    
            ' Say goodbye.
            textBox1.Text &= vbCrLf & "All done, exiting button-click event handler."
        End Sub
    
    
        Async Function DriverAsync() As Task
    
            ' Task(Of T) 
            ' Call and await the Task(Of T)-returning async method in the same statement.
            Dim result1 As Integer = Await TaskOfT_MethodAsync()
    
            ' Call and await in separate statements.
            Dim integerTask As Task(Of Integer) = TaskOfT_MethodAsync()
    
            ' You can do other work that does not rely on resultTask before awaiting.
            textBox1.Text &= String.Format("Application can continue working while the Task(Of T) runs. . . . " & vbCrLf)
    
            Dim result2 As Integer = Await integerTask
    
            ' Display the values of the result1 variable, the result2 variable, and
            ' the resultTask.Result property.
            textBox1.Text &= String.Format(vbCrLf & "Value of result1 variable:   {0}" & vbCrLf, result1)
            textBox1.Text &= String.Format("Value of result2 variable:   {0}" & vbCrLf, result2)
            textBox1.Text &= String.Format("Value of resultTask.Result:  {0}" & vbCrLf, integerTask.Result)
    
            ' Task 
            ' Call and await the Task-returning async method in the same statement.
            Await Task_MethodAsync()
    
            ' Call and await in separate statements.
            Dim simpleTask As Task = Task_MethodAsync()
    
            ' You can do other work that does not rely on simpleTask before awaiting.
            textBox1.Text &= String.Format(vbCrLf & "Application can continue working while the Task runs. . . ." & vbCrLf)
    
            Await simpleTask
        End Function
    
    
        ' TASK(OF T) EXAMPLE
        Async Function TaskOfT_MethodAsync() As Task(Of Integer)
    
            ' The body of an async method is expected to contain an awaited 
            ' asynchronous call.
            ' Task.FromResult is a placeholder for actual work that returns a string.
            Dim today As String = Await Task.FromResult(Of String)(DateTime.Now.DayOfWeek.ToString())
    
            ' The method then can process the result in some way.
            Dim leisureHours As Integer
            If today.First() = "S" Then
                leisureHours = 16
            Else
                leisureHours = 5
            End If
    
            ' Because the return statement specifies an operand of type Integer, the 
            ' method must have a return type of Task(Of Integer). 
            Return leisureHours
        End Function
    
    
        ' TASK EXAMPLE
        Async Function Task_MethodAsync() As Task
    
            ' The body of an async method is expected to contain an awaited 
            ' asynchronous call.
            ' Task.Delay is a placeholder for actual work.
            Await Task.Delay(2000)
            textBox1.Text &= String.Format(vbCrLf & "Sorry for the delay. . . ." & vbCrLf)
    
            ' This method has no return statement, so its return type is Task. 
        End Function
    
    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;
    
    namespace AsyncReturnTypes
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            // VOID EXAMPLE
            private async void button1_Click(object sender, RoutedEventArgs e)
            {
                textBox1.Clear();
    
                // Start the process and await its completion. DriverAsync is a 
                // Task-returning async method.
                await DriverAsync();
    
                // Say goodbye.
                textBox1.Text += "\r\nAll done, exiting button-click event handler.";
            }
    
            async Task DriverAsync()
            {
                // Task<T> 
                // Call and await the Task<T>-returning async method in the same statement.
                int result1 = await TaskOfT_MethodAsync();
    
                // Call and await in separate statements.
                Task<int> integerTask = TaskOfT_MethodAsync();
    
                // You can do other work that does not rely on integerTask before awaiting.
                textBox1.Text += String.Format("Application can continue working while the Task<T> runs. . . . \r\n");
    
                int result2 = await integerTask;
    
                // Display the values of the result1 variable, the result2 variable, and
                // the integerTask.Result property.
                textBox1.Text += String.Format("\r\nValue of result1 variable:   {0}\r\n", result1);
                textBox1.Text += String.Format("Value of result2 variable:   {0}\r\n", result2);
                textBox1.Text += String.Format("Value of integerTask.Result: {0}\r\n", integerTask.Result);
    
                // Task
                // Call and await the Task-returning async method in the same statement.
                await Task_MethodAsync();
    
                // Call and await in separate statements.
                Task simpleTask = Task_MethodAsync();
    
                // You can do other work that does not rely on simpleTask before awaiting.
                textBox1.Text += String.Format("\r\nApplication can continue working while the Task runs. . . .\r\n");
    
                await simpleTask;
            }
    
            // TASK<T> EXAMPLE
            async Task<int> TaskOfT_MethodAsync()
            {
                // The body of the method is expected to contain an awaited asynchronous
                // call.
                // Task.FromResult is a placeholder for actual work that returns a string.
                var today = await Task.FromResult<string>(DateTime.Now.DayOfWeek.ToString());
    
                // The method then can process the result in some way.
                int leisureHours;
                if (today.First() == 'S')
                    leisureHours = 16;
                else
                    leisureHours = 5;
    
                // Because the return statement specifies an operand of type int, the
                // method must have a return type of Task<int>.
                return leisureHours;
            }
    
    
            // TASK EXAMPLE
            async Task Task_MethodAsync()
            {
                // The body of an async method is expected to contain an awaited 
                // asynchronous call.
                // Task.Delay is a placeholder for actual work.
                await Task.Delay(2000);
                // Task.Delay delays the following line by two seconds.
                textBox1.Text += String.Format("\r\nSorry for the delay. . . .\r\n");
    
                // This method has no return statement, so its return type is Task.  
            }
        }
    }
    
  9. 프로그램을 실행 한 다음 선택 합니다 F5 키를 선택 하 여 시작 단추.

    다음과 같은 출력이 표시 되어야 합니다.

    Application can continue working while the Task<T> runs. . . . 
    
    Value of result1 variable:   5
    Value of result2 variable:   5
    Value of integerTask.Result: 5
    
    Sorry for the delay. . . .
    
    Application can continue working while the Task runs. . . .
    
    Sorry for the delay. . . .
    
    All done, exiting button-click event handler.
    

참고 항목

작업

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

연습: Async 메서드에 디버거 사용

참조

async(C# 참조)

Async(Visual Basic)

Await 연산자(Visual Basic)

await(C# 참조)

FromResult<TResult>

개념

비동기 프로그램의 제어 흐름(C# 및 Visual Basic)