C# ASP.NET核心中的异步和异步组合

C# ASP.NET核心中的异步和异步组合,c#,asp.net,multithreading,asynchronous,async-await,C#,Asp.net,Multithreading,Asynchronous,Async Await,我对如何使用异步和异步组合感到困惑,尤其是在asp.net核心中 这是案例1: 这是控制器中的代码 private readonly InfoService _infoService; public HomeController(InfoService infoService) { _infoService = infoService; } public IActionResult Index() { //Creat

我对如何使用异步和异步组合感到困惑,尤其是在asp.net核心中

这是案例1:

这是控制器中的代码

    private readonly InfoService _infoService;
    public HomeController(InfoService infoService)
    {
        _infoService = infoService;
    }
    public IActionResult Index()
    {
        //Create a stopwatch for getting excution time  
        var watch = new Stopwatch();
        watch.Start();
        var country = _infoService.GetCountry();
        var state = _infoService.GetState();
        var city = _infoService.GetCity(state);
        watch.Stop();
        ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;
        ViewBag.Data = city;
        return View();
    }

    public async Task<IActionResult> About()
    {
        //Create a stopwatch for getting excution time  
        var watch = new Stopwatch();
        watch.Start();
        var country =  _infoService.GetCountryAsync();
        var state =  _infoService.GetStateAsync();
        var city =  _infoService.GetCityAsync();
        var content = await country;
        var count = await state;
        var name = await city;
        watch.Stop();
        ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;
        ViewBag.Data = name;
        return View();
    }
本案结果如下:

运行索引操作,需要14003毫秒

运行关于操作,大约需要>14008毫秒,它可以在索引操作中的任何时间变化,通常在较高时间变化

  var watch = new Stopwatch();
  watch.Start();
  var country = await _infoService.GetCountryAsync();
  var state = await _infoService.GetStateAsync();
  var city = await _infoService.GetCityAsync();
  watch.Stop();
  ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;
  return View();
那么,在这个案例的行动中发生了什么?关于动作的两种情况的差异

  var watch = new Stopwatch();
  watch.Start();
  var country = await _infoService.GetCountryAsync();
  var state = await _infoService.GetStateAsync();
  var city = await _infoService.GetCityAsync();
  watch.Stop();
  ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;
  return View();
在两种情况下,当多请求/并发到关于操作时会发生什么情况和区别

[我知道与索引操作相比,它不是块线程]

这是案例3:

如果需要,如何在关于操作的中使用async

  • 返回了从国家/地区的值获取状态
  • 从国家的价值中获取城市,国家被返回
我目前正在使用这种方式:

  var country = await _infoService.GetCountryAsync();
  var state = await _infoService.GetStateAsync(country);
  var city = await _infoService.GetCityAsync(country,state);
里面有什么不对劲吗?在这种情况下,当有多个并发请求时会发生什么

[我认为它可能有价值,也可能没有价值]

在这种情况下,使用异步的最佳方式是什么

谢谢大家!

当你写作时

var country = await _infoService.GetCountryAsync();
var state = await _infoService.GetStateAsync();
var city = await _infoService.GetCityAsync();
你让别人等待你的任务。在任务完成之前,控制流不会传递给下一个操作员。从这个意义上讲,它与同步代码非常相似:

var country = _infoService.GetCountry();
var state = _infoService.GetState();
var city = _infoService.GetCity(state);
但对于异步版本,如果某个I/O操作将阻止进一步执行,则该线程将返回到线程池,并可由另一个操作使用

关于案例3:

您可以使用并行运行任务并等待所有任务完成:

var countryTask =  _infoService.GetCountryAsync();
var stateTask =  _infoService.GetStateAsync();
var cityTask =  _infoService.GetCityAsync();

await Task.WhenAll(new[] { countryTask, stateTask, cityTask });
任务完成后,您可以使用
Task.result
属性获得结果:

var country = countryTask.Result;
但是,不要对未完成的任务调用
Task.Result
Task.Wait()
,因为它会阻塞线程并降低异步模型的值。

当您编写

var country = await _infoService.GetCountryAsync();
var state = await _infoService.GetStateAsync();
var city = await _infoService.GetCityAsync();
你让别人等待你的任务。在任务完成之前,控制流不会传递给下一个操作员。从这个意义上讲,它与同步代码非常相似:

var country = _infoService.GetCountry();
var state = _infoService.GetState();
var city = _infoService.GetCity(state);
但对于异步版本,如果某个I/O操作将阻止进一步执行,则该线程将返回到线程池,并可由另一个操作使用

关于案例3:

您可以使用并行运行任务并等待所有任务完成:

var countryTask =  _infoService.GetCountryAsync();
var stateTask =  _infoService.GetStateAsync();
var cityTask =  _infoService.GetCityAsync();

await Task.WhenAll(new[] { countryTask, stateTask, cityTask });
任务完成后,您可以使用
Task.result
属性获得结果:

var country = countryTask.Result;

但是,不要对未完成的任务调用
Task.Result
Task.Wait()
,因为它会阻塞线程并降低异步模型的值。

很明显,一个是串行运行的,另一个是并行运行的-问题是什么?感谢您的回复,这导致我对async,特别是asp.net核心中的async理解不足,也就是说我不理解async如何在多并发请求环境中运行。我对@CodeFuller的答案有了更深的理解,Mickyder的链接很明显,一个是串行运行的,另一个是并行运行的-问题是什么?感谢您的回复,这导致我对async,特别是asp.net核心中的async理解不足,也就是说我不理解async如何在多并发请求环境中运行。我对@CodeFuller的回答和MickyD的链接有了更深的理解