none
异步编程和同步编程性能和效率的疑惑 RRS feed

  • 问题

  • 比如

      public async Task<string> GetWeatherAsync()  用于异步获取天气预报

      public string GetWeather() 用于同步获取天气预报

      public async Task<bool> UpdateWeatherAsync(string str) 用于异步保存天气预报信息到数据库

      public bool UpdateWeather(string str)用于异步保存天气预报信息到数据库

    那么在控制器的Action中 使用同步Action和异步Action  代码如下:

       /// <summary>
            /// 异步测试一
            /// </summary>
            /// <returns></returns>
            public async Task<IActionResult> TestSyncAsync()
            {
                string weatherStr = await GetWeatherAsync();
                bool state= await UpdateWeatherAsync(weatherStr);
                ViewBag.State = state;
                return View();
            }
    
            /// <summary>
            /// 异步测试二
            /// </summary>
            /// <returns></returns>
            public async Task<IActionResult> TestSyncAsync2()
            {
                var task = await GetWeatherAsync().ContinueWith(
                    (s) =>
                    {
                        return UpdateWeatherAsync(s.Result);
    
                    }
                    );
    
                ViewBag.State =await task;
                return View();
            }
    
            /// <summary>
            /// 同步测试一
            /// </summary>
            /// <returns></returns>
            public IActionResult TestSync()
            {
                bool state = UpdateWeather(GetWeather());
                ViewBag.State = state;
                return View();
            }


         学习异步编程有的疑惑 

    先获取天气,在把获取到的天气跟新到数据库,设置完毕返回状态。

    我的疑问:

    1. 这2种写法的异步的Action性能是否一样;
    2. 异步Action和同步的Action性能是否一样,或者说在并发数量超过多少时候会体现出异步Action的优势;
    3. 异步Action和同步Action 分别各自适用的场景是什么;  

    我为什么会有这个些疑问,因为我觉得首先不管是不是异步,我都得等到渠道天气信息后,才能更新数据库,数据库更新完毕后我才能设置状态。


    萌萌哒


    2019年1月13日 16:07

答案

全部回复

  • 你好,

    个人认为, 作为你的这种情况,异步并不会提高性能。你的这个主要的性能问题还是在网络的请求应答,这个时间异步处理不了的,这种情况下,异步的主要好处就是你的不会出现假死的现象(在等待天气结果之前,你是可以点击其他的按钮)。

    下面有一些文章可以帮组你理解一些关于异步的知识。

    https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/

    https://stackoverflow.com/questions/14455293/how-and-when-to-use-async-and-await

    Best regards,

    Zhanglong


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年1月14日 2:04
    版主
  • 比如

      public async Task<string> GetWeatherAsync()  用于异步获取天气预报

      public string GetWeather() 用于同步获取天气预报

      public async Task<bool> UpdateWeatherAsync(string str) 用于异步保存天气预报信息到数据库

      public bool UpdateWeather(string str)用于异步保存天气预报信息到数据库

    那么在控制器的Action中 使用同步Action和异步Action  代码如下:

       /// <summary>
            /// 异步测试一
            /// </summary>
            /// <returns></returns>
            public async Task<IActionResult> TestSyncAsync()
            {
                string weatherStr = await GetWeatherAsync();
                bool state= await UpdateWeatherAsync(weatherStr);
                ViewBag.State = state;
                return View();
            }
    
            /// <summary>
            /// 异步测试二
            /// </summary>
            /// <returns></returns>
            public async Task<IActionResult> TestSyncAsync2()
            {
                var task = await GetWeatherAsync().ContinueWith(
                    (s) =>
                    {
                        return UpdateWeatherAsync(s.Result);
    
                    }
                    );
    
                ViewBag.State =await task;
                return View();
            }
    
            /// <summary>
            /// 同步测试一
            /// </summary>
            /// <returns></returns>
            public IActionResult TestSync()
            {
                bool state = UpdateWeather(GetWeather());
                ViewBag.State = state;
                return View();
            }


         学习异步编程有的疑惑 

    先获取天气,在把获取到的天气跟新到数据库,设置完毕返回状态。

    我的疑问:

    1. 这2种写法的异步的Action性能是否一样;
    2. 异步Action和同步的Action性能是否一样,或者说在并发数量超过多少时候会体现出异步Action的优势;
    3. 异步Action和同步Action 分别各自适用的场景是什么;  

    我为什么会有这个些疑问,因为我觉得首先不管是不是异步,我都得等到渠道天气信息后,才能更新数据库,数据库更新完毕后我才能设置状态。


    萌萌哒


    1.个人认为两种异步的性能应该差不多,或者第二种比第一中稍微快点

    2.肯定是不一样了,要不然还有分什么同步和异步,有并发的话就可以用异步啊,没并发也可以用异步啊

    3.异步肯定是在并发。扩展方面比较好了,同步也可以用来进行并发了,具体场景具体分析


    please verify my account

    2019年1月15日 1:20
  • 非常感谢你推介的文章,看了之后大部分疑问的解开了

    萌萌哒

    2019年1月15日 1:57