private void ProcessRequests(object aRgUmEnT) { ProcessRequestArgs arg = aRgUmEnT as ProcessRequestArgs; if (arg == null) { return; } if (!processRequestsMutex.WaitOne(3000)) { return; } try { //Обработаем все запросы, связанные с таймером using (SqlConnection cn = new SqlConnection(arg.ConnectionString)) { cn.Open(); List <Pair <ClimbingTimerCommand, string> > listParams = new List <Pair <ClimbingTimerCommand, string> >(); SqlTransaction tran = cn.BeginTransaction(); try { SqlCommand cmd = new SqlCommand("SELECT REQUEST, PARAM, sys_date, GetDate() curDate" + " FROM prg_Qs(NOLOCK)" + " WHERE MACHINE <> " + MACHINE_PARAM_ID, cn); AddMachineID(cmd); cmd.Transaction = tran; using (SqlDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { try { ClimbingTimerCommand c = StaticClass.GetEnumValueFromStringNumeric <ClimbingTimerCommand>(rdr[0] as string); if (ContainsTimerData(c)) { listParams.Add(new Pair <ClimbingTimerCommand, string>(c, rdr[1] as string, (DateTime)rdr[2], (DateTime)rdr[3])); } } catch (FormatException) { } } } bool dataInserted = false; foreach (var v in listParams) { #region ForEachParam //Если мы запрашивали синхронизацию, то обновим значение bool synchroNeeded = endPoints.Count < 1 && !arg.IsMain && (arg.Parent.autoSynchro || !arg.Parent.firstSynchroCompleted); if (synchroNeeded && ((v.Value1 & ClimbingTimerCommand.Timer_SynchroCompleted) == ClimbingTimerCommand.Timer_SynchroCompleted)) { int[] vals = new int[4]; string[] s = v.Value2.Split(new char[] { ' ', ';' }, StringSplitOptions.RemoveEmptyEntries); if (s.Length < 4) { continue; } try { for (int i = 0; i < vals.Length; i++) { vals[i] = int.Parse(s[i]); } } catch (FormatException) { continue; } /*обновим остаток*/ if (Monitor.TryEnter(arg.Locker, 2000)) { try { TimeSpan oldBase = new TimeSpan(0, vals[0], vals[1]); oldBase -= (v.DateSelected - v.DateUpdated); arg.Parent.remainingInterval = oldBase; arg.Parent.rotationInterval = new TimeSpan(0, vals[2], vals[3]); arg.Parent.lastSignal = v.DateSelected; arg.Parent.firstSynchroCompleted = true; } finally { Monitor.Exit(arg.Locker); } arg.Parent.Start(); } } if (arg.IsMain && ((v.Value1 & ClimbingTimerCommand.Timer_SynchroRequest) == ClimbingTimerCommand.Timer_SynchroRequest)) { //Если кто-то запрашивает синхронизацию //Ответ поставим только один раз if (!dataInserted) { cmd.Parameters.Clear(); cmd.CommandText = "DELETE FROM prg_Qs WHERE REQUEST IN(@sr, @sc)"; cmd.Parameters.Add("@sr", SqlDbType.VarChar, 255).Value = StaticClass.GetEnumStringNumericValue(ClimbingTimerCommand.Timer_SynchroRequest); cmd.Parameters.Add("@sc", SqlDbType.VarChar, 255).Value = StaticClass.GetEnumStringNumericValue(ClimbingTimerCommand.Timer_SynchroCompleted); cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO prg_Qs (REQUEST, PARAM, MACHINE) VALUES (@sc,@p," + MACHINE_PARAM_ID + ")"; AddMachineID(cmd); if (Monitor.TryEnter(arg.Locker, 5000)) { try { cmd.Parameters.Add("@p", SqlDbType.VarChar, 255).Value = Math.Truncate(arg.Parent.remainingInterval.TotalMinutes).ToString("0") + ";" + arg.Parent.remainingInterval.Seconds.ToString() + ";" + Math.Truncate(arg.Parent.rotationInterval.TotalMinutes).ToString("0") + ";" + arg.Parent.rotationInterval.Seconds.ToString(); cmd.ExecuteNonQuery(); dataInserted = true; } finally { Monitor.Exit(arg.Locker); } } } } #endregion } if (!arg.IsMain && endPoints.Count < 1) { if (Monitor.TryEnter(arg.Locker, 1000)) { try { cmd.Parameters.Clear(); cmd.CommandText = "INSERT INTO prg_Qs (REQUEST, MACHINE, PARAM) VALUES(@sr," + MACHINE_PARAM_ID + ", '-')"; cmd.Parameters.Add("@sr", SqlDbType.VarChar, 255).Value = StaticClass.GetEnumStringNumericValue(ClimbingTimerCommand.Timer_SynchroRequest); AddMachineID(cmd); cmd.ExecuteNonQuery(); } finally { Monitor.Exit(arg.Locker); } } } tran.Commit(); } catch (Exception ex) { try { tran.Rollback(); } catch { } throw ex; } } } catch (ThreadAbortException) { return; } catch { } finally { processRequestsMutex.ReleaseMutex(); } }
private static bool ContainsTimerData(ClimbingTimerCommand c) { return(ContainsTimerData((byte)c)); }