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()); }
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()); }