async(C# 参考)

async 修饰符指示方法、它进行修改 lambda 表达式匿名方法 是异步的。 此类方法引用异步方法。

异步方法提供了一种简便方式完成可能需要长时间运行的工作,而不必阻止调用方的线程。 异步方法的调用方可以继续工作,而不必等待异步方法完成。

备注

async 和 await 关键字在 Visual Studio 2012 中引入)。有关在该版本的其他新增功能的信息,请参见 Visual Studio 2012 中的新增功能

有关异步编程的介绍,请参见 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)

下面的示例演示异步事件处理程序,StartButton_Click,结构调用异步方法,ExampleMethodAsync。 从方法的结果是一个下载网站的长度。 代码适用于 windows 演示基础 (WPF) 或 windows 中 app。

// In desktop apps that you create by using Visual Studio 2012, you must 
// add a reference and a using directive for System.Net.Http.
// In Windows Store apps, you must add using directives for System.Net.Http 
// and System.Threading.Tasks.

private async void StartButton_Click(object sender, RoutedEventArgs e)
{
    // ExampleMethodAsync returns a Task<int> and has an int result.
    // A value is assigned to intTask when ExampleMethodAsync reaches
    // an await.
    try
    {
        Task<int> intTask = ExampleMethodAsync();
        // You can do other work here that doesn't require the result from
        // ExampleMethodAsync. . . .
        // You can access the int result when ExampleMethodAsync completes.
        int intResult = await intTask;
    
        // Or you can combine the previous two steps:
        //int intResult = await ExampleMethodAsync();

        // Process the result (intResult). . . .
    }
    catch (Exception)
    {
        // Process the exception. . . .
    }
}

public async Task<int> ExampleMethodAsync()
{
    var httpClient = new HttpClient();

    // At the await expression, execution in this method is suspended, and
    // control returns to the caller of ExampleMethodAsync.
    // Variable exampleInt is assigned a value when GetStringAsync completes.
    int exampleInt = (await httpClient.GetStringAsync("https://msdn.microsoft.com")).Length;

    // You can break the previous line into several steps to clarify what happens:
    //Task<string> contentsTask = httpClient.GetStringAsync("https://msdn.microsoft.com");
    //string contents = await contentsTask;
    //int exampleInt = contents.Length; 

    // Continue with whatever processing is waiting for exampleInt. . . .

    // After the return statement, any method that's awaiting
    // ExampleMethodAsync can get the integer result.
    return exampleInt;
}

重要

有关使用类似的元素的完整 WPF 示例,请参见 演练:使用 Async 和 Await 访问 Web(C# 和 Visual Basic)。可以下载演练中的代码 开发人员代码示例

通常,async 关键字修改的方法至少包含一个 等待 表达式或语句。 方法同步运行,直到到达第一个表达式,await,这时它将挂起,直到等待的任务完成。 同时,控件返回到方法的调用方。 如果方法不包含一个 await 表达式或语句,则它同步执行。 编译器警告通知您不包含 await 的任何异步方法的,因为该情况可能指示错误。 有关更多信息,请参见编译器警告(等级 1)CS4014

async 关键字是上下文关键字。 以便修改方法、lambda 表达式或匿名方法时,它是关键字。 在其他上下文,则将该说明符解释为标识符。

返回类型

异步方法可以具有 TaskTask<TResult>无效的返回类型。 该方法不能声明任何 reft3c3bfhx(v=vs.110).md 参数,不过,它能调用具有这些参数的方法。

如果方法的 返回 语句指定类型 TResult,操作的指定 Task<TResult>,因为异步方法的返回类型。 使用 Task,如果有意义的不返回值,在方法完成。 即对方法的调用返回 Task,但是,随着 Task 完成时,等待 Task 的所有 await 表达式计算无效。

void 返回类型主要用于定义事件处理程序,void 返回类型需要。 无效返回的异步方法的调用方不等待它无法捕获方法引发的异常。

有关更多信息和示例,请参见异步返回类型(C# 和 Visual Basic)

请参见

任务

演练:使用 Async 和 Await 访问 Web(C# 和 Visual Basic)

参考

await(C# 参考)

AsyncStateMachineAttribute

概念

使用 Async 和 Await 的异步编程(C# 和 Visual Basic)