C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!(转载)

参考

异步执行

  static void Main(string[] args)
        {         
            Console.WriteLine("-------主线程启动-------");
            Task<int> task = GetStrLengthAsync();
            Console.WriteLine("主线程继续执行");
            Console.WriteLine("Task返回的值" + task.Result);
            Console.WriteLine("-------主线程结束-------");
            Console.ReadKey();
        }
        static async Task<int> GetStrLengthAsync()
        {
            Console.WriteLine("GetStrLengthAsync方法开始执行");
            //此处返回的<string>中的字符串类型,而不是Task<string>
            string str = await GetString();
            Console.WriteLine("GetStrLengthAsync方法执行结束");
            return str.Length;
        }

        static Task<string> GetString()
        {
            //Console.WriteLine("GetString方法开始执行")
            return Task<string>.Run(() =>
            {
                Thread.Sleep(2000);
                Console.WriteLine("GetString的返回值");
                return "GetString的返回值";
            });
        }

异步与回调2中对比

异步

 static void Main(string[] args)
        {          
            for (int i = 0; i < 100; i++)
            {
                test(i);
            }
            Console.ReadKey();
        }

        static private void test(int i)
        {
            Task<int> task = GetStrLengthAsync(i);
        }
        static async Task<int> GetStrLengthAsync(int i)
        {
            Console.WriteLine(i);
            string str = await GetString(i);
            Console.WriteLine($"结束{i}");
            return str.Length;
          
        }

        static Task<string> GetString(int i)
        {
            //Console.WriteLine("GetString方法开始执行")
            return Task<string>.Run(() =>
            {
                Thread.Sleep(10000);
                Console.WriteLine($"耗时操作{i}");
                return "GetString的返回值";
            });
        }

回调

         private delegate void AddHandler(int i);
        static void Main(string[] args)
        {          
            for (int i = 0; i < 100; i++)
            {
                test2(i);
            }
            Console.ReadKey();
        }
      
        static private void test2(int i)
        {
            AddHandler addHandler = new AddHandler(test3);
            addHandler.BeginInvoke(i,null,null);
        } 
        static private void test3(int i)
        {
            Console.WriteLine(i);
            test4(i);
            Console.WriteLine($"结束{i}");
        }
        static private void test4(int i)
        {
            Thread.Sleep(10000);
            Console.WriteLine($"耗时操作{i}");
        }

猜你喜欢

转载自www.cnblogs.com/macT/p/12049436.html