异步操作一般都是涉及多线程,这里使用Task来启动线程,好处就是他的线程不是new出来的 是从线程池里面去获取一个

 class Program
    {
        static void Main(string[] args)
        {

            Test t = new Test();
            Task.Run(() => { t.t3(); });
            Console.Read();
        }
    }

    public class Test
    {
        IList<string> list { get; set; }
        public Test()
        {
            if (list == null)
            {
                list = new List<string>();
            }
        }
        public async Task<string> T1()
        {
            Console.WriteLine("--t1--s");
            System.Threading.Thread.Sleep(1000);
            return await Task.Run<string>(() => { Console.WriteLine("--t1--e"); return "test"; });

        }
        public async Task<string> T2()
        {
            Console.WriteLine("t2");
            var t = await T1();
            return t;
        }
        public async void t3()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("---t3---s");
                Task.Run(() => { T2(); });
                if (list != null && list.Count > 0)
                {
                    Console.WriteLine(list[i]);
                }
                Console.WriteLine("---t3---e");
            }
        }
    }

  预期结果是

这里看到主线程并不等待结果子线程的结果

如果想等待的话  就必须要让其使用子线程的返回值

 public async void t3()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("---t3---s");
                list.Add(await Task.Run<string>(() => { return T2(); }));
                if (list != null && list.Count > 0)
                {
                    Console.WriteLine(list[i]);
                }
                Console.WriteLine("---t3---e");
            }
        }

用这个替换  list.Add里面添加的子元素需要子线程里面返回的结果值  这样运行出来

 

 posted on 2019-03-14 15:59  JetaimeBeaucoup  阅读(346)  评论(0编辑  收藏  举报