异步委托 多线程 多线程等待 多线程获取返回值

最近公司忙 有一周多时间没有更新了,下面继续

今天学的是异步多线程

首先把老师总结的知识点搬上来看一下 ,挺好理解的

1、异步方法会卡界面,异步多线程不会卡界面,因为同步方法会占用UI线程,无法响应其他操作;异步多线程,不会占用UI线程,方法由子线程完成

2、同步方法慢,只有主线程在执行方法;异步方法快,启动了多个线程同时执行方法,当然这样会占用更多的资源(多线程的调度管理,也需要消耗资源的)

3、异步多线程的方法启动和执行是无序的,因为线程的申请是无序获取的;不同线程任务执行的速度也不一定相同


下面来一套代码

首先是 不获取返回值的

 //待执行的委托方法
            Action<int> act = t =>
            {
                Thread.Sleep(1000);//为了看效果 延迟一下
                Console.WriteLine("方法启动{0},当前线程ID为{1}", t.ToString(), Thread.CurrentThread.ManagedThreadId);
            };

            //List保存启动线程的Iasync
            List<IAsyncResult> asyncList = new List<IAsyncResult>();

            //回调函数
            AsyncCallback asyback = t =>
            {
                Thread.Sleep(1000);//为了看效果 延迟一下
                Console.WriteLine("这里是回调函数:参数为{0},线程ID为{1}", t.AsyncState, Thread.CurrentThread.ManagedThreadId);
            };


            //多线程执行5次
            for (int i = 0; i < 5; i++)
            {
                //启动线程 并添加到List中 此步骤目的是为了可以下面进行多线程等待,如果不需要等待也不需要获取返回值,可不进行List添加
                asyncList.Add(act.BeginInvoke(i, asyback, i));
            }

            Console.WriteLine("等待前");
            //等待
            foreach (IAsyncResult async in asyncList)
            {
                async.AsyncWaitHandle.WaitOne();
            }

            Console.WriteLine("等待后");
结果


再来一种等待的代码

 while (asyncList.Where(t => t.IsCompleted == true).Count() <asyncList.Count())
            {
                Thread.Sleep(200);
            }


再来一套有返回值的

 //创建一个委托
            Func<int, string> func = t =>
            {
                Thread.Sleep(2000);
                Console.WriteLine("正在执行委托方法{0}线程编号{1}", t.ToString(), Thread.CurrentThread.ManagedThreadId);
                return t.ToString();
            };

            //通过键值对保存每个线程启动方法时生成的Iasync
            Dictionary<int, IAsyncResult> d = new Dictionary<int, IAsyncResult>();

            AsyncCallback asybak = t =>
            {
                Thread.Sleep(2000);
                Console.WriteLine("这里是回调函数{0}线程编号{1},本线程返回结果{2}", t.AsyncState, Thread.CurrentThread.ManagedThreadId, func.EndInvoke(d[(int)t.AsyncState]));
            };

            //多线程调用
            for (int i = 0; i < 5; i++)
            {
                //调用并添加到键值对中
                d.Add(i, func.BeginInvoke(i, asybak, i));

            }


            Console.WriteLine("等待前");

            //等待
            for (int i = 0; i < d.Count; i++)
            {
                d[i].AsyncWaitHandle.WaitOne();
            }

            Console.WriteLine("都执行完了");

结果




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值