void mainWorker_DoWork(object sender, DoWorkEventArgs e) { try { BackgroundWorker worker = sender as BackgroundWorker; //threadCount = Convert.ToInt32(spinEditThreadCount.Value);//这里不必要了,在点击按钮时已经赋值 int pageSize = 40; for (int k = 0; k < downShopList.Count; k++) { var shop = downShopList[k]; if (worker.CancellationPending) { e.Cancel = true; return; } ReportState state = new ReportState() { Current = k + 1, Total = downShopList.Count, Message = string.Format("正在同步店铺 {0} 的客户...", shop.title), }; worker.ReportProgress(1, state); #region initialize query time DateTime begin = DateTime.Now; DateTime end = DateTime.Now; switch (typeIndex) { // 15 days case 0: begin = DateTime.Now.AddDays(-15); break; // customize case 1: begin = this.dateEditBegin.DateTime; end = this.dateEditEnd.DateTime; break; // since shop created case 2: begin = shop.created; break; } #endregion #region Get total trade count TradeReq request = new TradeReq(); request.Status = null; request.PageSize = pageSize; request.PageNo = 1; request.StartCreated = begin.ToString("yyyy-MM-dd HH:mm:ss"); request.EndCreated = end.ToString("yyyy-MM-dd HH:mm:ss"); string sessionkey = SystemHelper.GetSessionKey(shop.nick); TradeRsp response = TopService.TradesSoldGet(sessionkey, request); sub_done = 0; sub_total = response.TotalResults; #endregion if (sub_total == 0) { continue; } #region Dispatch task to thread threadList.Clear(); if (sub_total <= pageSize) { #region total count < page size SycTaskArgs task = new SycTaskArgs { ShopNick = shop.nick, PageSize = pageSize, QueryBeginTime = begin, QueryEndTime = end, }; task.PageNoList.Add(1); BackgroundWorker w = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true, }; w.RunWorkerCompleted += new RunWorkerCompletedEventHandler(w_RunWorkerCompleted); w.ProgressChanged += new ProgressChangedEventHandler(w_ProgressChanged); w.DoWork += new DoWorkEventHandler(w_DoWork); taskList.Add(task); threadList.Add(w); threadCount = 1; #endregion } else { int pageCount = (sub_total % pageSize == 0) ? (sub_total / pageSize) : (sub_total / pageSize + 1); if (threadCount < pageCount) { #region page count < thread count threadCount = pageCount; for (int i = 0; i < threadCount; i++) { SycTaskArgs task = new SycTaskArgs { ShopNick = shop.nick, PageSize = 40, QueryBeginTime = begin, QueryEndTime = end, }; task.PageNoList.Add(i + 1); BackgroundWorker w = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true, }; w.RunWorkerCompleted += new RunWorkerCompletedEventHandler(w_RunWorkerCompleted); w.ProgressChanged += new ProgressChangedEventHandler(w_ProgressChanged); w.DoWork += new DoWorkEventHandler(w_DoWork); taskList.Add(task); threadList.Add(w); } #endregion } else { #region page count > thread count for (int i = 0; i < threadCount; i++) { SycTaskArgs task = new SycTaskArgs { ShopNick = shop.nick, PageSize = 40, QueryBeginTime = begin, QueryEndTime = end, }; BackgroundWorker w = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true, }; w.RunWorkerCompleted += new RunWorkerCompletedEventHandler(w_RunWorkerCompleted); w.ProgressChanged += new ProgressChangedEventHandler(w_ProgressChanged); w.DoWork += new DoWorkEventHandler(w_DoWork); taskList.Add(task); threadList.Add(w); } int index = 0; for (int i = 0; i < pageCount; i++, index++) { if (index >= taskList.Count) { index = 0; } taskList[i].PageNoList.Add(i + 1); } #endregion } } #endregion #region run tasks signal = new AutoResetEvent(false); for (int i = 0; i < threadCount; i++) { threadList[i].RunWorkerAsync(taskList[i]); } signal.WaitOne(); #endregion } } catch (Exception ex) { XtraMessageBox.Show(ex.Message); } }
void w_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; SycTaskArgs task = e.Argument as SycTaskArgs; foreach (var p in task.PageNoList) { #region get trade information //这里改成mainWorker,即主线程取消子线程工作全部停止 if (mainWorker.CancellationPending) { e.Cancel = true; return; } TradeReq request = new TradeReq(); TradeRsp response = null; request.Status = null; request.PageSize = task.PageSize; request.PageNo = p; request.StartCreated = task.QueryBeginTime.ToString("yyyy-MM-dd HH:mm:ss"); request.EndCreated = task.QueryEndTime.ToString("yyyy-MM-dd HH:mm:ss"); string sessionkey = SystemHelper.GetSessionKey(task.ShopNick); response = TopService.TradesSoldGet(sessionkey, request); #endregion #region if getting trade failed do next if (response == null || response.Trades == null) { lock (vlock) { sub_done += task.PageSize; } continue; } #endregion foreach (var t in response.Trades.Trade) { //if (worker.CancellationPending) //这里改成mainWorker,即主线程取消子线程工作全部停止 if (mainWorker.CancellationPending) { e.Cancel = true; return; } lock (vlock) { sub_done++; } TradeRsp fulltrade = TopService.TradeFullinfoGet(sessionkey, t.Tid); #region if getting trade detail failed do next if (fulltrade == null || fulltrade.Trade == null) { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 失败:无法获取交易信息!", t.BuyerNick), }; worker.ReportProgress(0, state); continue; } #endregion UserRsp buyer = TopService.UserGet(sessionkey, fulltrade.Trade.BuyerNick, fulltrade.Trade.AlipayNo); #region if getting buyer detail failed do next if (buyer == null || buyer.User == null) { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 失败:无法获取买家信息!", t.BuyerNick), }; worker.ReportProgress(0, state); continue; } #endregion Alading.Entity.Consumer consumer = Alading.Business.ConsumerService.GetConsumer(fulltrade.Trade.BuyerNick); if (consumer == null) { #region Consumer is not existed and save it consumer = new Alading.Entity.Consumer(); consumer.nick = buyer.User.Nick; consumer.sex = buyer.User.Sex; consumer.buyer_zip = buyer.User.Location.Zip; consumer.location_city = buyer.User.Location.City; consumer.location_state = buyer.User.Location.State; consumer.location_district = buyer.User.Location.District; consumer.location_address = buyer.User.Location.Address; consumer.location_country = buyer.User.Location.Address; consumer.birthday = buyer.User.Birthday; consumer.credit = buyer.User.BuyerCredit.ToString(); consumer.level = buyer.User.BuyerCredit.Level; consumer.score = buyer.User.BuyerCredit.Score; consumer.status = buyer.User.Status; consumer.created = DateTime.Parse(buyer.User.Created); consumer.last_visit = buyer.User.LastVisit; consumer.mobilephone = fulltrade.Trade.ReceiverMobile; consumer.phone = fulltrade.Trade.ReceiverPhone; consumer.email = fulltrade.Trade.BuyerEmail; consumer.buyer_name = fulltrade.Trade.ReceiverName; consumer.alipay = fulltrade.Trade.AlipayNo; ReturnType result = Alading.Business.ConsumerService.AddConsumer(consumer); if (result == ReturnType.Success) { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 信息成功!", consumer.nick), }; worker.ReportProgress(1, state); Alading.Entity.ConsumerAddress addr = Alading.Business.ConsumerAddressService.GetConsumerAddress( c => c.tid == fulltrade.Trade.Tid).FirstOrDefault(); if (addr == null) { addr = new Alading.Entity.ConsumerAddress { buyer_nick = fulltrade.Trade.BuyerNick, location_address = fulltrade.Trade.ReceiverAddress, location_city = fulltrade.Trade.ReceiverCity, location_country = buyer.User.Location.Country, location_district = fulltrade.Trade.ReceiverDistrict, location_state = fulltrade.Trade.ReceiverState, location_zip = fulltrade.Trade.ReceiverZip, receiver_mobile = fulltrade.Trade.ReceiverMobile, receiver_name = fulltrade.Trade.ReceiverName, receiver_phone = fulltrade.Trade.ReceiverPhone, receiver_zip = fulltrade.Trade.ReceiverZip, tid = fulltrade.Trade.Tid, }; result = Alading.Business.ConsumerAddressService.AddConsumerAddress(addr); if (result == ReturnType.Success) { state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 地址信息成功!", consumer.nick), }; worker.ReportProgress(1, state); } else { state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 地址信息失败:数据保存失败!", consumer.nick), }; worker.ReportProgress(1, state); } } } else { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 信息失败:数据保存失败!", consumer.nick), }; worker.ReportProgress(1, state); continue; } #endregion } else { #region Consumer existed and update address information ReportState state0 = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("客户 {0} 已存在!", consumer.nick), }; worker.ReportProgress(0, state0); Alading.Entity.ConsumerAddress addr = Alading.Business.ConsumerAddressService.GetConsumerAddress( c => c.tid == fulltrade.Trade.Tid).FirstOrDefault(); if (addr == null) { addr = new Alading.Entity.ConsumerAddress { buyer_nick = fulltrade.Trade.BuyerNick, location_address = fulltrade.Trade.ReceiverAddress, location_city = fulltrade.Trade.ReceiverCity, location_country = buyer.User.Location.Country, location_district = fulltrade.Trade.ReceiverDistrict, location_state = fulltrade.Trade.ReceiverState, location_zip = fulltrade.Trade.ReceiverZip, receiver_mobile = fulltrade.Trade.ReceiverMobile, receiver_name = fulltrade.Trade.ReceiverName, receiver_phone = fulltrade.Trade.ReceiverPhone, receiver_zip = fulltrade.Trade.ReceiverZip, tid = fulltrade.Trade.Tid, }; ReturnType result = Alading.Business.ConsumerAddressService.AddConsumerAddress(addr); if (result == ReturnType.Success) { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 地址信息成功!", consumer.nick), }; worker.ReportProgress(1, state); } else { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 地址信息失败:数据保存失败!", consumer.nick), }; worker.ReportProgress(1, state); } } #endregion } } } }