async await return Task
本文关键字:Task return await async | 更新日期: 2023-09-27 18:16:55
谁能解释一下这对同步方法意味着什么?如果我尝试将方法更改为async
,那么VS会抱怨它。
如此:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
这行不通:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
基本上我想知道这到底是什么意思:Task.FromResult<object>(null);
async
方法与普通方法不同。无论您从async
方法返回什么,都封装在Task
中。
如果你没有返回值(void),它将被Task
包装,如果你返回int
,它将被Task<int>
包装,以此类推。
如果你的异步方法需要返回int
,你会把方法的返回类型标记为Task<int>
,你会返回普通的int
而不是Task<int>
。编译器会帮你把int
转换成Task<int>
。
private async Task<int> MethodName()
{
await SomethingAsync();
return 42;//Note we return int not Task<int> and that compiles
}
同样,当你返回Task<object>
时,你的方法的返回类型应该是Task<Task<object>>
public async Task<Task<object>> MethodName()
{
return Task.FromResult<object>(null);//This will compile
}
因为你的方法返回Task
,它不应该返回任何值。否则无法编译。
public async Task MethodName()
{
return;//This should work but return is redundant and also method is useless.
}
请记住,没有await
语句的async方法不是async
。
你需要使用await关键字当使用async和你的函数返回类型应该是通用的。这里是一个返回值的例子:
public async Task<object> MethodName()
{
return await Task.FromResult<object>(null);
}
下面是一个没有返回值的例子:
public async Task MethodName()
{
await Task.CompletedTask;
}
阅读这些:
- 任务并行库(TPL)简化了向应用程序添加并行性和并发性
- Tasks命名空间:提供简化并发和异步代码编写工作的类型
- async:使用async修饰符指定方法、lambda表达式或匿名方法是异步的。
- await操作符:异步等待任务完成
添加async关键字只是简化状态机创建的语法糖。本质上,编译器接受你的代码;
public async Task MethodName()
{
return null;
}
并把它变成;
public Task MethodName()
{
return Task.FromResult<object>(null);
}
如果你的代码有任何await
关键字,编译器必须接受你的方法,并把它转换成一个类来表示执行它所需的状态机。在每个await
关键字处,变量的状态和堆栈将保存在类的字段中,类将自己添加为您正在等待的任务的完成钩子,然后返回。
当该任务完成时,您的任务将再次执行。因此,将一些额外的代码添加到方法的顶部,以恢复变量的状态并跳转到下一个代码块。
参见async &等待生成?对于一个血腥的例子
这个过程与编译器处理带有yield语句的迭代器方法的方式有很多共同之处。
这是一个返回String类型的Task (c#匿名函数,或者换句话说,使用委托'Func')
public static async Task<string> MyTask()
{
//C# anonymous AsyncTask
return await Task.FromResult<string>(((Func<string>)(() =>
{
// your code here
return "string result here";
}))());
}
为了从异步方法获得正确的响应,您需要在调用这些任务方法时放置await。它将等待将其转换回返回值类型而不是任务类型。
E。g var content = await StringAsyncTask (
)where public async Task<<strong>String> StringAsyncTask ())