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 表达式或匿名方法时,它是关键字。在其他上下文,则将该说明符解释为标识符。
返回类型
异步方法可以具有 Task、Task<TResult>或 无效的返回类型。该方法不能声明任何 ref 或 t3c3bfhx(v=vs.110).md 参数,不过,它能调用具有这些参数的方法。
如果方法的 返回 语句指定类型 TResult,操作的指定 Task<TResult>,因为异步方法的返回类型。使用 Task,如果有意义的不返回值,在方法完成。即对方法的调用返回 Task,但是,随着 Task 完成时,等待 Task 的所有 await 表达式计算无效。
void 返回类型主要用于定义事件处理程序,void 返回类型需要。无效返回的异步方法的调用方不等待它无法捕获方法引发的异常。
有关更多信息和示例,请参见异步返回类型(C# 和 Visual Basic)。
请参见
任务
演练:使用 Async 和 Await 访问 Web(C# 和 Visual Basic)