protected void WaitForJobComplete(QueueJob job, int?seconds = null)
        {
            try
            {
                DateTime startTime = DateTime.Now;
                int      waitTime  = seconds ?? 300;
                JobState jobState  = JobState.Unknown;
                do
                {
                    jobState = BaseProjectContext.WaitForQueue(job, 3);
                }while (jobState != JobState.Success && startTime.AddSeconds(waitTime) > DateTime.Now);

                if (jobState == JobState.Success)
                {
                    LoggerHelper.Instance.Pass(job.Id.ToString());
                }
                else
                {
                    LoggerHelper.Instance.Fail(string.Format("The job status is {0}.", jobState));
                }
            }
            catch (Exception e)
            {
                job.Cancel();
                LoggerHelper.Instance.Fail(string.Format("Warning: The job is failed.\nMessage: {0}. \nMore:{1} \nRetrying...", e.Message, e.StackTrace));
            }
        }
        public void UpdateProject(DraftProject draftProject, List <StagingDTO> affectedStagings)
        {
            if (draftProject == null)
            {
                return;
            }
            QueueJob job   = null;
            JobState state = JobState.Unknown;

            try
            {
                logger.LogAndSendMessage(null, "UpdateProject",
                                         draftProject.Id, winServiceIterationUid,
                                         $"UpdateProject Update {draftProject.Id}",
                                         false, null, CommonConstants.Epm, CommonConstants.Start);
                job = draftProject.Update();
                WaitForQueue(job, draftProject.Id, draftProject, out state);
                logger.LogAndSendMessage(null, "UpdateProject Update WaitForQueue",
                                         draftProject.Id, winServiceIterationUid,
                                         $"UpdateProject Update WaitForQueue {draftProject.Id}",
                                         false, null);
                if (state == JobState.Success)
                {
                    if (affectedStagings != null)
                    {
                        foreach (StagingDTO affectedStaging in affectedStagings)
                        {
                            affectedStaging.RecordStateGeneral = RecordStateConst.Updated;
                        }
                    }
                    else
                    {
                        logger.LogAndSendMessage(null, "UpdateProject Update WaitForQueue",
                                                 draftProject.Id, winServiceIterationUid,
                                                 $"UpdateProject 1 WaitForQueue job failed. Project UID: {draftProject.Id}; jobState: {state}",
                                                 true, null);
                    }
                }
                logger.LogAndSendMessage(null, "UpdateProject",
                                         draftProject.Id, winServiceIterationUid,
                                         $"UpdateProject END {draftProject.Id}",
                                         false, null, CommonConstants.Epm, CommonConstants.End);
            }
            catch (ServerException serverException)
            {
                logger.LogAndSendMessage(null, "UpdateProject",
                                         draftProject.Id, winServiceIterationUid,
                                         $"UpdateProject {draftProject.Id} JobState: {state}",
                                         false, serverException);
                try
                {
                    if (job != null)
                    {
                        job.Cancel();
                        ProjectContext.Load(job);
                        ExecuteQuery();
                    }
                }
                catch (Exception exception)
                {
                    logger.LogAndSendMessage(null, "UpdateProject Cancel",
                                             draftProject.Id, winServiceIterationUid,
                                             $"UpdateProject Cancel {draftProject.Id} JobState: {state}",
                                             false, exception);
                }
            }
        }