protected void Application_Start() { Database.SetInitializer <WebProject1Context>(new CreateDatabaseIfNotExists <WebProject1Context>()); using (var context = new WebProject1Context()) { context.Database.Initialize(force: true); // If exception was thrown here, // Please open Server Explorer -> Data Connection -> // if WebProject1Context-20190411102821.mdf is existed, please delete it at first, then re-build this probject and run it again. // If WebProject1Context-20190411102821.mdf doesn't exist (right click) -> Add Connection -> // Data Source: Microsoft SQL Server Database File (SqlClient) // Database file name -> browse ... select App_Data folder, // input WebProject1Context-20190411102821.mdf, then click OK, the mdf file will be created. } Services.AsyncSendMailService.Init(); Services.TempMailTaskStore.Init(); Services.MassSendMailService.Init(); Services.DbSendMailService.Init(); AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
static void _queryTaskThreadProc() { using (var db = new WebProject1Context()) { // change running tasks (unfinished) to terminated var unfinishedTasks = (from s in db.DbMailTasks select s) .Where(s => s.Status == DbMailTaskStatus.Running) .ToArray(); for (int i = 0; i < unfinishedTasks.Length; i++) { var task = unfinishedTasks[i]; task.Status = DbMailTaskStatus.Terminated; db.Entry(task).State = EntityState.Modified; db.SaveChanges(); } int miniSleep = 2; while (true) { var tasks = (from s in db.DbMailTasks select s) .Where(s => s.Status == DbMailTaskStatus.Pending) .ToArray(); if (tasks.Length == 0) { Thread.Sleep(miniSleep); if (miniSleep * miniSleep < 1024) { miniSleep *= miniSleep; } continue; } miniSleep = 2; for (int i = 0; i < tasks.Length; i++) { _processTask(db, tasks[i]); } } } }
static void _processTask(WebProject1Context db, DbMailTask mailTask) { var threadPool = new DbSendThreadPool(); threadPool.UpdateResult = _updateResult; _threadPools.Add(mailTask.TaskId, threadPool); var recipients = db.DbRecipients.ToArray(); mailTask.TotalCount = recipients.Length; mailTask.Status = DbMailTaskStatus.Running; db.Entry(mailTask).State = EntityState.Modified; db.SaveChanges(); Task.Run(() => { threadPool.Start(mailTask, recipients); }); }
static void _updateResult(int taskId, bool isSucceeded, string recipientAddress, string status) { using (var db = new WebProject1Context()) { DbRecipientResult result = new DbRecipientResult(); result.CreationTime = DateTime.Now; result.IsSucceeded = isSucceeded; result.Recipient = recipientAddress; result.TaskId = taskId; result.Status = status; db.DbRecipientResults.Add(result); db.SaveChanges(); var task = db.DbMailTasks.Find(taskId); var taskStatus = _queryTaskStatus(taskId); if (task != null && taskStatus != null) { task.Failed = taskStatus.Failed; task.Succeeded = taskStatus.Succeeded; task.TotalCount = taskStatus.TotalCount; if (taskStatus.Completed) { task.Status = DbMailTaskStatus.Completed; } db.Entry(task).State = EntityState.Modified; db.SaveChanges(); } } }