private static long Log(long?applicationId = null, OMLogStatus status = OMLogStatus.Running) { string exeInfo = GetEnvironmentData(); OMLog serviceLog = null; if (applicationId.HasValue) { serviceLog = OMLog.Where(x => x.Id == applicationId) .SelectAll() .Execute() .FirstOrDefault(); } if (serviceLog == null) { serviceLog = new OMLog(); } serviceLog.LastCheckDate = DateTime.Now; serviceLog.ExeInfo = exeInfo; serviceLog.StartDate = DateTime.Now; serviceLog.Status = (long)status; serviceLog.UserId = SRDSession.GetCurrentUserId(); serviceLog.Save(); return(serviceLog.Id); }
/// <summary> /// Создает новую таску /// </summary> /// <param name="queue"></param> private void StartTask(OMQueue queue) { if (!WorkerCommon.ProcessTypeCache.ContainsKey(queue.ProcessTypeId)) { LogError(queue, "Не найден тип процесса с ИД: " + queue.ProcessTypeId); return; } OMProcessType processType = WorkerCommon.ProcessTypeCache[queue.ProcessTypeId]; ILongProcess longProcess; try { longProcess = WorkerCommon.GetLongProcessObject(queue.ProcessTypeId); } catch (Exception ex) { LogError(queue, ex.Message); return; } if (longProcess == null) { LogError(queue, "Не удалось создать объект типа: " + processType.ClassName); return; } CancellationTokenSource cancelTokenSource = new CancellationTokenSource(); queue.StartDate = DateTime.Now; queue.LastCheckDate = DateTime.Now; queue.Status_Code = Status.Running; queue.Save(); Task task = new Task(() => { try { _workerData.СurrentTasks[queue.Id].CurrentThread = Thread.CurrentThread; // Так как данный процесс запускается в отдельном потоке в него необходимо передать данные об авторизованном пользователе, // иначе работа будет выполняться под учетной записью пула приложений if (queue.UserId > 0 && SRDCache.Users.ContainsKey((int)queue.UserId.Value)) { SRDSession.SetThreadCurrentPrincipal(queue.UserId.Value); } queue.CleanPropertyChangedList(); longProcess.StartProcess(processType, queue, cancelTokenSource.Token); processType.LastStartDate = queue.StartDate; processType.Save(); queue.EndDate = DateTime.Now; queue.LastCheckDate = DateTime.Now; queue.Status_Code = Status.Completed; queue.Save(); _workerData.СurrentTasks.Remove(queue.Id); } catch (Exception ex) { _workerData.СurrentTasks.Remove(queue.Id); int errorId = ErrorManager.LogError(ex); queue.EndDate = DateTime.Now; queue.Status_Code = Status.Faulted; queue.ErrorId = errorId; var message = ex.Message; if (message.Length >= 4000) { message = message.Substring(0, 4000); } queue.Message = message; queue.Save(); try { longProcess.LogError(queue.ObjectId, ex, errorId); } catch (Exception) { } } }, cancelTokenSource.Token); TaskData taskData = new TaskData { Task = task, CancellationTokenSource = cancelTokenSource, LongProcess = longProcess, ProcessTypeId = processType.Id }; _workerData.СurrentTasks.Add(queue.Id, taskData); taskData.Task.Start(); }