Example #1
0
        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);
        }
Example #2
0
        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]);
                    }
                }
            }
        }
Example #3
0
        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);
            });
        }
Example #4
0
        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();
                }
            }
        }