用async来修饰一个方法:表明这个方法是异步的,声明的方法的返回类型必须为:void或Task或Task<TResult>。
方法内部必须含有await修饰的方法:如果方法内部没有await关键字修饰的表达式,哪怕函数被async修饰也只能算作同步方法,执行的时候也是同步执行的。
被await修饰的只能是Task或者Task<TResule>类型,通常情况下是一个返回类型是Task/Task<TResult>的方法,当然也可以修饰一个Task/Task<TResult>变量,await只能出现在已经用async关键字修饰的异步方法中。
关于被修饰的对象,也就是返回值类型是Task和Task<TResult>函数或者Task/Task<TResult>类型的变量:如果是被修饰对象的前面用await修饰,那么返回值实际上是void或者TResult
private Task<string> TestMethod()
{
var task = Task.Run(()=> {
return "Hello";
});
return task;
}
string str = await TestMethod() 等价于 string str = TestMethod() .Result 注:尽量不要用TestMethod() .Result,容易导致代码死锁。
private async void button1_Click(object sender, EventArgs e)
{
var t = Task.Run(() => {
return "Hello";
});
textBox1.Text = await t;
}
原文:https://www.cnblogs.com/xiechunjian/p/14209755.html