public bool InitializeTaskBuilder() { state = false; currentIndex = 0; taskcode = Guid.NewGuid().ToString(); currentTask = new Alading.Entity.Task { TaskCode = taskcode, Type = "SendEmail", Desc = "Send email to consumers", StartTime = DateTime.Now, EndTime = null, Creator = string.Empty, Done = 0, Total = Total }; isInitialized = Alading.Business.TaskService.AddTask(currentTask) == Alading.Core.Enum.ReturnType.Success; return isInitialized; }
private void dispatcher_DoWork(object sender, DoWorkEventArgs e) { threadList.Clear(); taskList.Clear(); BackgroundWorker dispatcher = sender as BackgroundWorker; #region Get a task var query = Alading.Business.TaskService.GetTask(c => c.Type == "SendEmail" && c.EndTime == null); if (query == null || query.Count == 0) { e.Result = 0; return; } currentTask = query[0]; #endregion #region Get email for sending var list = Alading.Business.ConsumerVisitService.GetConsumerVisit(c => c.TaskCode == currentTask.TaskCode && c.Status == "待发送"); if (list == null || list.Count == 0) { e.Result = 0; return; } #endregion #region Dispatch task if (list.Count < 10) { SendEmailTask task1 = new SendEmailTask(); task1.Configuration = configuration; task1.TaskCode = currentTask.TaskCode; task1.TaskList = list; taskList.Add(task1); BackgroundWorker worker = new BackgroundWorker(); worker.WorkerSupportsCancellation = true; worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); threadList.Add(worker); } else { int size = 10; if (list.Count > configuration.ThreadCount * 10) { size = list.Count / configuration.ThreadCount; } int count = list.Count / size; int skip = 0; for (int i = 0; i < count; i++) { SendEmailTask task1 = new SendEmailTask(); task1.Configuration = configuration; task1.TaskCode = currentTask.TaskCode; task1.TaskList = list.Skip(skip).Take(size).ToList(); taskList.Add(task1); BackgroundWorker worker = new BackgroundWorker(); worker.WorkerSupportsCancellation = true; worker.DoWork += new System.ComponentModel.DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); threadList.Add(worker); skip += size; } var left = list.Skip(skip).Take(size).ToList(); taskList[0].TaskList.AddRange(left); } doneThreadCount = 0; totalThreadCount = 0; #endregion for (int i = 0; i < threadList.Count; i++) { threadList[i].RunWorkerAsync(taskList[i]); } autoReset.WaitOne(); }