C# 异步/等待函数比较
我试图理解async/Wait,我想知道这两种方法是否工作相同。如果不是,你能解释一下原因吗C# 异步/等待函数比较,c#,async-await,C#,Async Await,我试图理解async/Wait,我想知道这两种方法是否工作相同。如果不是,你能解释一下原因吗 public async Task<Client> GetClient() { return await _clientRepository.GetAll().Where(x => x.Id == 1).FirstOrDefaultAsync(); } public Task<Client&g
public async Task<Client> GetClient()
{
return await _clientRepository.GetAll().Where(x => x.Id == 1).FirstOrDefaultAsync();
}
public Task<Client> GetClient2()
{
return Task.FromResult(_clientRepository.GetAll().Where(x => x.Id == 1).FirstOrDefault());
}
public async Task Run()
{
var result = await GetClient();
var result2 = await GetClient2();
}
它们是不同的,当您添加async关键字时,您将启用以下两个功能 标记的异步方法可以使用wait或wait来指定挂起点。wait操作符告诉编译器,在等待的异步过程完成之前,异步方法无法继续超过该点。同时,控制返回给异步方法的调用方 在等待表达式处暂停异步方法并不构成方法的退出,最后块不会运行 标记的异步方法本身可以由调用它的方法等待
您应该阅读这里的async/await文档:它们不一样,当您添加async关键字时,您可以启用以下两个功能 标记的异步方法可以使用wait或wait来指定挂起点。wait操作符告诉编译器,在等待的异步过程完成之前,异步方法无法继续超过该点。同时,控制返回给异步方法的调用方 在等待表达式处暂停异步方法并不构成方法的退出,最后块不会运行 标记的异步方法本身可以由调用它的方法等待 您应该在此处阅读async/await文档:第一种方法: async关键字为生成状态机提供编译器信号。事件如果将空void方法标记为async,编译器将生成状态机 第二种方法: 您正在返回热任务-已完成的任务。此方法将像普通方法一样工作 顺便说一句,第二个场景最好缓存这样的任务。例如,您可以创建字典开关并返回缓存的任务。如果这样做,则不会每次在堆上分配新任务。第一种方法: async关键字为生成状态机提供编译器信号。事件如果将空void方法标记为async,编译器将生成状态机 第二种方法: 您正在返回热任务-已完成的任务。此方法将像普通方法一样工作
顺便说一句,第二个场景最好缓存这样的任务。例如,您可以创建字典开关并返回缓存的任务。如果这样做,您就不会每次都在堆上分配新任务。让我指出一些与您的函数有关的事情:
public async Task<Client> GetClient()
{
return await _clientRepository.GetAll().Where(x => x.Id == 1).FirstOrDefaultAsync();
}
这个函数根本不是异步的。它将完全同步执行,而不会产生线程
即使你这样做了:
public async Task<Client> GetClient2()
{
return await Task.FromResult(_clientRepository.GetAll().Where(x => x.Id == 1).FirstOrDefault());
}
如果您发现有一个wait,并且它是该方法的最后一行,那么不要使用async/wait,只返回任务而不是等待它。这样可以避免不必要的开销
例如:
public async Task<boolean> IsIntegerIGetFromRemoteServerPostitiveAsync(){
int result = await GetSomeIntegerAsync();
Console.WriteLine('Resuming execution of the method');
return i>0;
}
public Task<string> GetUserInformationAsync(string username){
var url = $"http://userinfo.com?username={username}"
return GetSomeJsonFromHttpServerAsync(url); //Assuming this returns Task<string>
}
让我指出一些关于你的函数的事情:
public async Task<Client> GetClient()
{
return await _clientRepository.GetAll().Where(x => x.Id == 1).FirstOrDefaultAsync();
}
这个函数根本不是异步的。它将完全同步执行,而不会产生线程
即使你这样做了:
public async Task<Client> GetClient2()
{
return await Task.FromResult(_clientRepository.GetAll().Where(x => x.Id == 1).FirstOrDefault());
}
如果您发现有一个wait,并且它是该方法的最后一行,那么不要使用async/wait,只返回任务而不是等待它。这样可以避免不必要的开销
例如:
public async Task<boolean> IsIntegerIGetFromRemoteServerPostitiveAsync(){
int result = await GetSomeIntegerAsync();
Console.WriteLine('Resuming execution of the method');
return i>0;
}
public Task<string> GetUserInformationAsync(string username){
var url = $"http://userinfo.com?username={username}"
return GetSomeJsonFromHttpServerAsync(url); //Assuming this returns Task<string>
}
我推荐阅读,它从生成器/承诺的角度解释了异步/等待。它们完全不同,甚至在内部调用不同的方法。。。您希望这两个方法以何种方式相同?是否_clientRepository.GetAll.Wherex=>x.Id==1.FirstOrDefaultAsync;等于Task.FromResult\u clientRepository.GetAll.where x=>x.Id==1.FirstOrDefault;我推荐阅读,它从生成器/承诺的角度解释了异步/等待。它们完全不同,甚至在内部调用不同的方法。。。您希望这两个方法以何种方式相同?是否_clientRepository.GetAll.Wherex=>x.Id==1.FirstOrDefaultAsync;等于Task.FromResult\u clientRepository.GetAll.where x=>x.Id==1.FirstOrDefault;您将无法等待非异步的函数。-这有点错误。。。我的意思是,若该方法返回任务,无论该方法是否包含异步,您都可以等待它,但类似的情况也有很多。更多信息:您将无法等待非异步函数。-这有点错误。。。我的意思是,若该方法返回任务,无论该方法是否包含异步,您都可以等待它,但类似的情况也有很多。更多信息