/// <summary> /// Блокировка /// </summary> /// <param name="type"></param> /// <param name="rowId"></param> /// <param name="millisecondTimeout"></param> /// <param name="codeToRun"></param> public static void Lock(Type type, int rowId, Action codeToRun, int millisecondTimeout = DefaultTimeout) { using (var bolt = new DataLocker(type, rowId, millisecondTimeout)) { if (bolt.Safe) { codeToRun(); } else { throw new TimeoutException(string.Format("Не удалось получить монопольный доступ к таблице {0}, к строке id: {1} в течение {2}мс", type, rowId, millisecondTimeout)); } } }
/// <summary> /// Изменение данных трекера /// </summary> /// <param name="data">объект данных</param> public static void UpdateGpsData(DataGpsData data) { DataLocker.Lock(typeof(DataGpsData), data.Id, () => { DataGpsData obj; using (var dc = new GpsTrackerDataContext()) { obj = (from _obj in dc.GpsData where _obj.Id == data.Id select _obj).FirstOrDefault(); if (obj == null) { throw new KeyNotFoundException(String.Format("{0}: Запись с таким id:{1} не найдена", MethodBase.GetCurrentMethod(), data.Id)); } } using (var dc = new GpsTrackerDataContext()) { dc.GpsData.Attach(data, obj); dc.SubmitChanges(); } }); }