zoukankan      html  css  js  c++  java
  • 初探asp.net异步编程之await

          终于毕业了,也顺利进入一家期望的旅游互联网公司。27号入职。放肆了一个多月没写代码,好方啊。

          另外一下观点均主要针对于await.

          请先看这段话,来自async in C# 5.0.  接下来几个月的时间,我将花时间来简单翻译这本书。

         

    写在前面(带着问题学习)
    一.根据代码和执行结果,初探异步编程的执行过程。

    *问题1:await会让当前线程一直等待吗?await等待的时间中一直占用线程资源吗?

    *问题2:等待await数据返回交给等待线程再继续向下执行吗?

    *问题3:向await下一条语句执行的线程,是执行await的线程吗?

    二.异步编程async,await的使用意义和适用场景。

    *问题1:异步编程可以让程序变快吗?

    *问题2:异步编程执行耗时计算有用吗?

    *问题3:既然异步编程执行顺序和同步相同,那么其意义何在?

    解惑一(初步结果)
    测试代码
     class Program
        {
            static void Main(string[] args)
            {
                Task.Run(()=>FirsTask());
                Console.ReadLine();
            }
            public static async Task<string> FirsTask()
            {
                Console.WriteLine("1.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
                var result = await SecondTask();
                Console.WriteLine("6.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
                return result;
            }
            public static async Task<string> SecondTask()
            {
                using (var client = new HttpClient())
                {
                    Console.WriteLine("2.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
                    var result = await client.GetAsync(
                        "http://stackoverflow.com/questions/37991851/jenkins-configure-page-not-loading-version1-651-3-chrome-browser");
                    await ThirdTask();
                    Console.WriteLine("5.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
                    return await result.Content.ReadAsStringAsync();
                }
            }
            public static async Task<string> ThirdTask()
            {
                using (var client = new HttpClient())
                {
                    Console.WriteLine("3.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
                    var result = await client.GetAsync(
                        "http://stackoverflow.com/questions/37993657/managing-outgoing-calls-settings-in-skype-for-business-client-using-remote-power");
                    Console.WriteLine("4.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
                    return await result.Content.ReadAsStringAsync();
                }
            }
        }
    输出结果
    输出结果说明了前三个问题:
      我们可以看到输出1和6,2和5,3和4往往不是相同的线程,但是也未必不是相同的线程。 事实证明,await不会让当前线程等待await的结果,继而由等待线程继续向下执行。 而是,遇到await时,当前线程会被释放到线程池。在await返回结果后,在调用任意空闲线程向下执行
    解惑二(意义和用途)
      由于当前线程遇到await时会被释放到线程池不会在时间上的等待中占用线程资源。 事实也证明,我们当前异步代码的执行顺序和同步代码执行顺序是相同的,在这样的情况下,线程被释放就是可以被重复利用的。 这样的重要意义在于,iis中线程池线程数是有限的,如果当前可以并发一百个请求,在同步情况下, 那么一百个请求导致一百个线程都在等待中。但是在异步过程中,线程被释放了,阻塞等待的时间没有了,也就可以容纳更多的请求。 程序要向下执行,依然要等到await结果,所以说同步和异步的执行时间是一样的,不会因为异步而减少执行时间。

      异步编程特别适用于网络操作,因为网络操作发起请求之后等待它完成就行,所以这时候执行到这的线程,可以释放并会到线程池中,网络操作执行完成之后,再从线程池中随机拿一个线程继续执行。

      

    最后的补充:刚才讨论的是await的作用。之所以如上测试代码能够按照同步的过程来执行,是await的作用。比如我们在FirstTask中不等待SecondTask的结果时,那么执行顺序是会改变的,6会提前输出出来。这是async的作用,不阻塞线程。我个人认为,在不需要await结果的情况下,async是可以减少执行时间的。

    转载请注明本文地址: http://www.cnblogs.com/tdws/p/5613871.html%20%20%20%20

  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/tdws/p/5613871.html
Copyright © 2011-2022 走看看