C# Async Await 异步多线程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace Async_Await
{
    class Program
    {
        static  void Main(string[] args)
        {
            Program prm = new Program();
            Console.WriteLine($"主线程start{Thread.CurrentThread.ManagedThreadId}");
            prm.Invoke();
            Console.WriteLine($"主线程end{Thread.CurrentThread.ManagedThreadId}");
            Console.ReadKey();
        }

        public async void Invoke()
        {
            Program prm = new Program();
            long s =await prm.LongAsync();
            int l = await prm.DoSumAsync(22, 3);
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}+Hi" + s.ToString());
            prm.TestAsync();
           
        }
        public void TestAsync()
        {
            Console.WriteLine($"TestAsync执行{Thread.CurrentThread.ManagedThreadId}");
            List<Task> lst = new List<Task>();
            for (int i = 0; i < 5; i++)
            {
                int k = i;//要不然代码中i一直为5
                lst.Add(Task.Run(() => { Console.WriteLine($"TestAsync子线程{k}Start{Thread.CurrentThread.ManagedThreadId}"); }));
            }
            TaskFactory tf = new TaskFactory();
            //tf.ContinueWhenAny(lst.ToArray(), t => { Console.WriteLine($"TestAsync子线程某一个执行完成{Thread.CurrentThread.ManagedThreadId}"); });
            tf.ContinueWhenAll(lst.ToArray(), t => { Console.WriteLine($"TestAsync子线程全部执行完成{Thread.CurrentThread.ManagedThreadId}"); });
            Console.WriteLine($"TestAsync结束{Thread.CurrentThread.ManagedThreadId}");
        }

        public async Task<long> LongAsync()
        {
            Console.WriteLine($"LongAsync执行{Thread.CurrentThread.ManagedThreadId}");

               long lg= await Task.Run(() =>
               {
                   Thread.Sleep(2000);
                   long s = 0;
                   Console.WriteLine($"LongAsync1 Start{Thread.CurrentThread.ManagedThreadId}");
                   for (int i = 0; i < 100000; i++)
                   {
                       s += i;
                   }
                   Console.WriteLine($"LongAsync1 End{Thread.CurrentThread.ManagedThreadId}");
                   return s;
               });

            //Console.WriteLine(s.ToString()+$"当前线程ID{ Thread.CurrentThread.ManagedThreadId}");


            long lgs=await Task.Run(() =>
            {
                Thread.Sleep(2000);
                long v = 0;
                Console.WriteLine($"LongAsync2 Start{Thread.CurrentThread.ManagedThreadId}");
                for (int i = 0; i < 1000000; i++)
                {
                    v += i;
                }
                Console.WriteLine($"LongAsync2 End{Thread.CurrentThread.ManagedThreadId}");
                return v;
            });

            Console.WriteLine(lgs.ToString());
            Console.WriteLine($"LongAsync 结束{Thread.CurrentThread.ManagedThreadId}");
            return lg;
        }

        public async Task<int> DoSumAsync(int a, int b)
        {
            //3.await 表达式
            Console.WriteLine($"DoSumAsync Start{Thread.CurrentThread.ManagedThreadId}");

            int sum = await Task.Run(() => { Console.WriteLine(a + b); return a + b; });

            Console.WriteLine($"DoSumAsync End{Thread.CurrentThread.ManagedThreadId}");
            return sum;
        }
    }

}

主 线程碰到await Task会自动返回,去执行其他,await Task后的代码需要等待其先完成后,再交给其他线程池的线程去完成.

结果:

C# Async Await 异步多线程

 

上一篇:Fritzing软件绘制Arduino面包板接线图传感器模块库文件097


下一篇:async,await.task