Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步/等待函数比较_C#_Async Await - Fatal编程技术网

C# 异步/等待函数比较

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

我试图理解async/Wait,我想知道这两种方法是否工作相同。如果不是,你能解释一下原因吗

       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;您将无法等待非异步的函数。-这有点错误。。。我的意思是,若该方法返回任务,无论该方法是否包含异步,您都可以等待它,但类似的情况也有很多。更多信息:您将无法等待非异步函数。-这有点错误。。。我的意思是,若该方法返回任务,无论该方法是否包含异步,您都可以等待它,但类似的情况也有很多。更多信息