Task 多线程 并行

 public async Task<ActionResult> Index()
        {

            int asnNum = 0, soNum = 0, OrdFirNum = 0, OrdSecNum = 0, OrdSigNum = 0;
            List<Task> tasks = new List<Task>();


            #region Action方法


            System.Threading.CancellationTokenSource cts = new System.Threading.CancellationTokenSource();
            TaskFactory taskFactory = new TaskFactory();
            Dictionary<string, int> Arrint = new Dictionary<string, int>();
            System.Threading.ReaderWriterLock ORWLock = new System.Threading.ReaderWriterLock();


            #region 方法1


            //Action<string> doGetNum = (data) =>
            //{
            //    new Action(() =>
            //    {
            //        try
            //        {
            //            //处理方法
            //            System.Threading.Thread.Sleep(5000);
            //            // 请求写锁 
            //            ORWLock.AcquireWriterLock(100);
            //            Models.WebdbContext AppDb = new Models.WebdbContext();
            //            switch (data)
            //            {
            //                case "ASN_ORDER_HEAD":
            //                    Arrint.Add(data, AppDb.ASN_ORDER_HEAD.Count());
            //                    break;
            //                case "SO_ORDER_HEAD":
            //                    Arrint.Add(data, AppDb.SO_ORDER_HEAD.Count());
            //                    break;
            //                case "ORDERS_FIRLINE_HEAD":
            //                    Arrint.Add(data, AppDb.ORDERS_FIRLINE_HEAD.Where(x => x.ADDTS.Value.Day == DateTime.Now.Day).Count());
            //                    break;
            //                case "ORDERS_SECLINE_HEAD":
            //                    Arrint.Add(data, AppDb.ORDERS_SECLINE_HEAD.Where(x => x.ADDTS.Value.Day == DateTime.Now.Day).Count());
            //                    break;
            //                case "ORDERS_SINGLE_HEAD":
            //                    Arrint.Add(data, AppDb.ORDERS_SINGLE_HEAD.Where(x => x.ADDTS.Value.Day == DateTime.Now.Day).Count());
            //                    break;
            //            }
            //        }
            //        finally
            //        {
            //            // 释放写锁 
            //            ORWLock.ReleaseWriterLock();
            //        }
            //    }).Invoke();
            //};


            //tasks.Add(Task.Run(() => { doGetNum("ASN_ORDER_HEAD"); }));
            //tasks.Add(Task.Run(() => { doGetNum("SO_ORDER_HEAD"); }));
            //tasks.Add(Task.Run(() => { doGetNum("ORDERS_FIRLINE_HEAD"); }));
            //tasks.Add(Task.Run(() => { doGetNum("ORDERS_SECLINE_HEAD"); }));
            //tasks.Add(Task.Run(() => { doGetNum("ORDERS_SINGLE_HEAD"); }));


            //Task OTask = taskFactory.ContinueWhenAll(tasks.ToArray(), x => new Action(() =>
            //{
            //    foreach (var item in Arrint)
            //    {
            //        switch (item.Key)
            //        {
            //            case "ASN_ORDER_HEAD":
            //                asnNum = item.Value;
            //                break;
            //            case "SO_ORDER_HEAD":
            //                soNum = item.Value;
            //                break;
            //            case "ORDERS_FIRLINE_HEAD":
            //                OrdFirNum = item.Value;
            //                break;
            //            case "ORDERS_SECLINE_HEAD":
            //                OrdSecNum = item.Value;
            //                break;
            //            case "ORDERS_SINGLE_HEAD":
            //                OrdSigNum = item.Value;
            //                break;
            //        }
            //    }
            //}).Invoke());


            #region 方法2


            Action<string,System.Threading.CancellationToken> doGetNum = (data, ct) =>
            {
                new Action(() =>
                {
                    try
                    {
                        if (ct.IsCancellationRequested)
                            return;
                        //处理方法
                        System.Threading.Thread.Sleep(5000);
                        // 请求写锁 
                        ORWLock.AcquireWriterLock(100);
                        Models.WebdbContext AppDb = new Models.WebdbContext();
                        switch (data)
                        {
                            case "ASN_ORDER_HEAD":
                                Arrint.Add(data, AppDb.ASN_ORDER_HEAD.Count());
                                break;
                            case "SO_ORDER_HEAD":
                                Arrint.Add(data, AppDb.SO_ORDER_HEAD.Count());
                                break;
                            case "ORDERS_FIRLINE_HEAD":
                                Arrint.Add(data, AppDb.ORDERS_FIRLINE_HEAD.Where(x => x.ADDTS.Value.Day == DateTime.Now.Day).Count());
                                break;
                            case "ORDERS_SECLINE_HEAD":
                                Arrint.Add(data, AppDb.ORDERS_SECLINE_HEAD.Where(x => x.ADDTS.Value.Day == DateTime.Now.Day).Count());
                                break;
                            case "ORDERS_SINGLE_HEAD":
                                Arrint.Add(data, AppDb.ORDERS_SINGLE_HEAD.Where(x => x.ADDTS.Value.Day == DateTime.Now.Day).Count());
                                break;
                        }
                    }
                    finally
                    {
                        // 释放写锁 
                        ORWLock.ReleaseWriterLock();
                    }
                }).Invoke();
            };


            #endregion


            tasks.Add(Task.Run(() => doGetNum("ASN_ORDER_HEAD", cts.Token), cts.Token));
            tasks.Add(Task.Run(() => doGetNum("SO_ORDER_HEAD", cts.Token), cts.Token));
            tasks.Add(Task.Run(() => doGetNum("ORDERS_FIRLINE_HEAD", cts.Token), cts.Token));
            tasks.Add(Task.Run(() => doGetNum("ORDERS_SECLINE_HEAD", cts.Token), cts.Token));
            tasks.Add(Task.Run(() => doGetNum("ORDERS_SINGLE_HEAD", cts.Token), cts.Token));


            Task OTask = taskFactory.ContinueWhenAll(tasks.ToArray(), x => new Action(() =>
            {
                foreach (var item in Arrint)
                {
                    switch (item.Key)
                    {
                        case "ASN_ORDER_HEAD":
                            asnNum = item.Value;
                            break;
                        case "SO_ORDER_HEAD":
                            soNum = item.Value;
                            break;
                        case "ORDERS_FIRLINE_HEAD":
                            OrdFirNum = item.Value;
                            break;
                        case "ORDERS_SECLINE_HEAD":
                            OrdSecNum = item.Value;
                            break;
                        case "ORDERS_SINGLE_HEAD":
                            OrdSigNum = item.Value;
                            break;
                    }
                }
            }).Invoke(), System.Threading.CancellationToken.None);


            #endregion


            OTask.Wait();


            #endregion


            #region 方法2


            //tasks.Add(Task.Run(() => { asnNum = GetNum("ASN_ORDER_HEAD"); }));
            //tasks.Add(Task.Run(() => { soNum = GetNum("SO_ORDER_HEAD"); }));
            //tasks.Add(Task.Run(() => { OrdFirNum = GetNum("ORDERS_FIRLINE_HEAD"); }));
            //tasks.Add(Task.Run(() => { OrdSecNum = GetNum("ORDERS_SECLINE_HEAD"); }));
            //tasks.Add(Task.Run(() => { OrdSigNum = GetNum("ORDERS_SINGLE_HEAD"); }));
            //Task.WaitAll(tasks.ToArray());


            #endregion


            ViewBag.AsnCount = asnNum;
            ViewBag.SOCount = soNum;
            ViewBag.PreOrderCount = OrdFirNum + OrdSecNum;

            ViewBag.OrderCount = OrdSigNum;

            return view();

}


修改自:http://www.cnblogs.com/icyJ/p/Parallel_TaskFactory.html

参考 :http://www.cnblogs.com/lonelyxmas/p/3959303.html

线程同步:http://www.cnblogs.com/gjhjoy/p/3568570.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值