public ActionResult Home(AdviserSearchModel model) { //顾问列表需要的当前城市的下级地区 var ip = "117.82.196.195"; var districts = this.districtService.GetDistrictByIp(ip); //顾问列表分页数据 model.OperatorType = AdviserEnum.FurnitureAdviser; var result = this.adviserService.GetPagingData(model); return Json(result, JsonRequestBehavior.AllowGet); }
我的代码一开始是上面这种写法,只有等待第一个服务执行完,才会执行第二个服务。
因为两次调用service代码都比较耗时,后来想到用多线程。也就是.net为我们封装好的Task类。
修改如下:
public ActionResult Design(AdviserSearchModel model) { //顾问列表需要的当前城市的下级地区 var ip = "117.82.196.195"; var districtsTask = Task.Run(() => { return this.districtService.GetDistrictByIp(ip); }); //顾问列表分页数据 model.OperatorType = AdviserEnum.DesignAdviser; var pagingTask = Task.Run(()=> { return this.adviserService.GetPagingData(model); }); var districts = districtsTask.Result; var result = pagingTask.Result; return Json(result, JsonRequestBehavior.AllowGet); }
红色字体上面的代码把任务加到线程里面,不阻塞当前线程。只有在走到红色字体的时候,才会阻塞线程,等待CPU执行任务结束,获取线程的执行结果。红色的两行代码是并行执行的。我的电脑是4核的,所以我相信耗时,应该是那个消耗较长的服务的时间。