Пример #1
0
        public async Task <BaseResponse> BatchTask()
        {
            List <ModulusClass> all = new List <ModulusClass>();

            //假设有100个任务
            for (int i = 0; i < 100; i++)
            {
                ModulusClass item = new ModulusClass();
                item.Key   = i % 5;
                item.Value = i;
                all.Add(item);
            }

            var workList = all.GroupBy(c => c.Key).Select(g => g.ToList()).ToList();

            List <Task <BaseResponse> > taskList = new List <Task <BaseResponse> >();

            foreach (var item in workList)
            {
                var w = Task.Run(async() =>
                {
                    //这里实际执行任务,并返回结果
                    return(BaseResponse.Ok());
                });

                taskList.Add(w);
            }


            await Task.WhenAll(taskList);

            return(BaseResponse.Ok());
        }
Пример #2
0
        public async Task <BaseResponse> Test()
        {
            for (int i = 0; i < 100; i++)
            {
                ModulusClass item = new ModulusClass();
                item.Key   = i % 5;
                item.Value = i;
                Worker.WorkQueue.Enqueue(item);
            }
            LogHelper.Info(Worker.WorkQueue.Count.ToString());

            List <Task> taskList = new List <Task>();

            for (int i = 0; i < 5; i++)
            {
                Worker worker = new Worker();

                //如果在异步代码中直接赋值i,i都会是5。。。。。哈哈
                int a = i;
                //如果直接用worker.Run(); 不会新起现场,而是还是用主线程执行。这是因为不await .asycn就没用,跟同步方法一样,所以就同步执行了。
                //asycn await主要解决的是异步,而不是多线程,所以你还要用Task.Run 来指定对线程执行
                //Task.Run(async () =>
                //{
                //    await worker.Run(a);
                //});


                //这样写会变成等待,也就是单线程
                //taskList.Add(worker.Run(a));
                //这样写会变成等待,也就是单线程
                //Task b=worker.Run(a);

                //这样使用w才能异步执行,并且把任务加到taskList,为啥正常的taskList.Add(worker.Run());就变成了同步代码呢?不懂
                var w = Task.Run(async() =>
                {
                    //这里循环后打印出来taskList.Count是0,说明for循环更快的完成了
                    //taskList.Add(worker.Run(a));
                    var b = worker.Run(a);
                });

                taskList.Add(w);
            }

            //这里打印出来的count 是0,说明for循环更快的完成了
            LogHelper.Info(taskList.Count.ToString());
            await Task.WhenAll(taskList);


            return(BaseResponse.Ok());
        }