static private void Worker() { (new Logger()).WriteDebug3("in"); Item.Status eStatus = Item.Status.Unknown; DateTime dtLastChanged = DateTime.MaxValue; DateTime dtServersNow = DateTime.MaxValue; List <Item> aToDelete = new List <Item>(); Item[] aItems; try { while (true) { aToDelete.Clear(); dtServersNow = DateTime.Now; lock (_aItems) { aItems = _aItems.Where(o => Item.Status.Stopped == (eStatus = o.eStatus) || Item.Status.Error == eStatus || (Item.Status.Started != eStatus && o.dtStatusChanged.AddSeconds(Preferences.nRemovingDelayInSeconds) < dtServersNow)).ToArray(); foreach (Item cItem in aItems) { if (Item.Status.Prepared != cItem.eStatus) { (new Logger()).WriteNotice("deleting: " + cItem.ToString()); ItemDelete(cItem, true, (Item.Status.Stopped == cItem.eStatus ? Item.Status.Stopped : Item.Status.Error)); } else { (new Logger()).WriteNotice("timeworn: item prepared more than " + Preferences.nRemovingDelayInSeconds + " seconds ago" + cItem.ToString()); ItemDelete(cItem, true, Item.Status.Error); } } } lock (_aItemsDeleted) { aItems = _aItemsDeleted.Where(o => true).ToArray(); DateTime dtTimeLineForDeleted = DateTime.Now.Subtract(new TimeSpan(1, 0, 0)); foreach (Item cItem in aItems) { if (cItem.dtStatusChanged < dtTimeLineForDeleted) { _aItemsDeleted.Remove(cItem); (new Logger()).WriteNotice("worker: vanished: " + cItem.ToString()); } } } System.Threading.Thread.Sleep(3000); } } catch (Exception ex) { (new Logger()).WriteError(ex); } }
static private void ItemDelete(Item cItem, bool bAddToDeleted, Item.Status eStatus) { string slog = "deleted: status = {" + cItem.eStatus + "}, item = {" + cItem.GetHashCode() + "}, info = {" + cItem.sInfo + "}"; try { lock (_aItems) { lock (_aItemsDeleted) { try { if (_aItems.Contains(cItem)) { _aItems.Remove(cItem); if (bAddToDeleted) { cItem.eStatus = eStatus; _aItemsDeleted.Add(cItem); } } else if (_aItemsDeleted.Contains(cItem)) { _aItemsDeleted.Remove(cItem); (new Logger()).WriteNotice("item:delete:vanished: " + cItem.ToString()); } } catch { throw new Exception("указанный элемент не зарегистрирован [item:" + cItem.GetHashCode() + "]"); } } } (new Logger()).WriteNotice(slog); } catch (Exception ex) { (new Logger()).WriteError(ex); } }
static private void ItemDelete(Item cItem, Item.Status eStatus) { ItemDelete(cItem, false, eStatus); }