private void threadPost(object par) { while (true) { INDEX_SEMATHREAD indx_semathread = (INDEX_SEMATHREAD)WaitHandle.WaitAny(m_arEvtThread); //Отправление сообщений... int err = -1; string toPost = string.Empty; if (m_listQueueMessage.Count > 0) { switch (s_mode) { case LOG_MODE.DB: if (m_evtConnSett.WaitOne(0, true) == true) { lock (m_objQueueMessage) { ////Отладка!!! //Console.WriteLine(@"Логгирование: сообщений на вХоде=" + m_listQueueMessage.Count); int indx_queue = 0 , cnt_running = 0; while ((indx_queue < m_listQueueMessage.Count) && (cnt_running < MAX_COUNT_MESSAGE_ONETIME)) { if (m_listQueueMessage[indx_queue].m_state == STATE_MESSAGE.QUEUE) { toPost += getInsertQuery(m_listQueueMessage[indx_queue]) + @";"; m_listQueueMessage[indx_queue].m_state = STATE_MESSAGE.RUNNING; cnt_running++; } else { ; } indx_queue++; } } DbTSQLInterface.ExecNonQuery(ref s_dbConn, toPost, null, null, out err); if (!(err == 0)) { //Ошибка при записи сообщений... retryQueueMessage(); disconnect(); m_evtConnSett.Reset(); } else { //Успех при записи сообщений... clearQueueMessage(); } ////Отладка!!! //lock (m_objQueueMessage) //{ // Console.WriteLine(@"Логгирование: сообщений на вЫходе=" + m_listQueueMessage.Count); // foreach (MESSAGE msg in m_listQueueMessage) // Console.WriteLine(@"Тип сообщения=" + msg.m_state.ToString ()); //} } else { ; //Нет соединения с БД } break; case LOG_MODE.FILE_EXE: case LOG_MODE.FILE_DESKTOP: case LOG_MODE.FILE_LOCALDEV: case LOG_MODE.FILE_NETDEV: bool locking = false; if ((!(m_listQueueMessage == null)) && (m_listQueueMessage.Count > 0)) { lock (m_objQueueMessage) { int indx_queue = 0; while (indx_queue < m_listQueueMessage.Count) { if (m_listQueueMessage[indx_queue].m_bSeparator == true) { toPost += MessageSeparator + Environment.NewLine; } else { ; } if (m_listQueueMessage[indx_queue].m_bDatetimeStamp == true) { toPost += m_listQueueMessage[indx_queue].m_strDatetimeReg + Environment.NewLine; toPost += DatetimeStampSeparator + Environment.NewLine; } else { ; } toPost += m_listQueueMessage[indx_queue].m_text + Environment.NewLine; if (m_listQueueMessage.Count == 1) { locking = m_listQueueMessage[indx_queue].m_bLockFile; } else { ; } if (locking == false) { if ((DateTime.Now - logRotateCheckLast).TotalSeconds > logRotateChekMaxSeconds) { //Принудить к проверке размера файла locking = true; } else { ; } } else { ; } m_listQueueMessage[indx_queue].m_state = STATE_MESSAGE.RUNNING; indx_queue++; } } if (locking == true) { LogLock(); LogCheckRotate(); } else { ; } if (File.Exists(m_fileName) == true) { try { if ((m_sw == null) || (m_fi == null)) { //Вариант №1 //FileInfo f = new FileInfo(m_fileName); //FileStream fs = f.Open(FileMode.Append, FileAccess.Write, FileShare.Write); //m_sw = new LogStreamWriter(fs, Encoding.GetEncoding("windows-1251")); //Вариант №2 m_sw = new LogStreamWriter(m_fileName, true, Encoding.GetEncoding("windows-1251")); m_fi = new FileInfo(m_fileName); } else { ; } m_sw.Write(toPost); m_sw.Flush(); } catch (Exception e) { retryQueueMessage(); /*m_sw.Close ();*/ m_sw = null; m_fi = null; } } else { retryQueueMessage(); } //if (externalLog == true) //{ // if (timeStamp == true) // delegateUpdateLogText(DateTime.Now.ToString() + ": " + message + Environment.NewLine); // else // delegateUpdateLogText(message + Environment.NewLine); //} //else // ; clearQueueMessage(); if (locking == true) { LogUnlock(); } else { ; } } else { } break; case LOG_MODE.UNKNOWN: default: break; } } else { ; } if (indx_semathread == INDEX_SEMATHREAD.STOP) { break; } else { m_arEvtThread[(int)INDEX_SEMATHREAD.MSG].Reset(); } } }
private void threadPost(object par) { while (true) { INDEX_SEMATHREAD indx_semathread = (INDEX_SEMATHREAD)WaitHandle.WaitAny(m_arEvtThread); //Отправление сообщений... int err = -1; string toPost = string.Empty; if (m_listQueueMessage.Count > 0) { switch (s_mode) { case LOG_MODE.DB: if (m_evtConnSett.WaitOne(0) == true) { lock (m_objQueueMessage) { ////Отладка!!! //Console.WriteLine(@"Логгирование: сообщений на вХоде=" + m_listQueueMessage.Count); int indx_queue = 0 , cnt_running = 0; while ((indx_queue < m_listQueueMessage.Count) && (cnt_running < MAX_COUNT_MESSAGE_ONETIME)) { if (m_listQueueMessage[indx_queue].m_state == STATE_MESSAGE.QUEUE) { toPost += getInsertQuery(m_listQueueMessage[indx_queue]) + @";"; m_listQueueMessage[indx_queue].m_state = STATE_MESSAGE.RUNNING; cnt_running++; } else { ; } indx_queue++; } } DbTSQLInterface.ExecNonQuery(ref s_dbConn, toPost, null, null, out err); if (!(err == 0)) { //Ошибка при записи сообщений... lock (m_objQueueMessage) { //Постановка ПОВТОРно сообщений в очередь foreach (MESSAGE msg in m_listQueueMessage) { if (msg.m_state == STATE_MESSAGE.RUNNING) { msg.m_state = STATE_MESSAGE.QUEUE; } else { ; } } } disconnect(); m_evtConnSett.Reset(); } else { //Успех при записи сообщений... lock (m_objQueueMessage) { //Найти обработанные сообщения List <int> listIndxMsgRunning = new List <int>(); foreach (MESSAGE msg in m_listQueueMessage) { if (msg.m_state == STATE_MESSAGE.RUNNING) { listIndxMsgRunning.Add(m_listQueueMessage.IndexOf(msg)); } else { ; } } //Сортировать список индексов в ОБРАТном порядке // для удаления сообщений из списка по ИНДЕКСу listIndxMsgRunning.Sort(delegate(int i1, int i2) { return(i1 > i2 ? -1 : 1); }); //Удалить обработанные сообщения foreach (int indx in listIndxMsgRunning) { m_listQueueMessage.RemoveAt(indx); } } } ////Отладка!!! //lock (m_objQueueMessage) //{ // Console.WriteLine(@"Логгирование: сообщений на вЫходе=" + m_listQueueMessage.Count); // foreach (MESSAGE msg in m_listQueueMessage) // Console.WriteLine(@"Тип сообщения=" + msg.m_state.ToString ()); //} } else { ; //Нет соединения с БД } break; case LOG_MODE.FILE: bool locking = false; if ((!(m_listQueueMessage == null)) && (m_listQueueMessage.Count > 0)) { lock (m_objQueueMessage) { while (m_listQueueMessage.Count > 0) { if (m_listQueueMessage[0].m_bSeparator == true) { toPost += MessageSeparator + Environment.NewLine; } else { ; } if (m_listQueueMessage[0].m_bDatetimeStamp == true) { toPost += m_listQueueMessage[0].m_strDatetimeReg + Environment.NewLine; toPost += DatetimeStampSeparator + Environment.NewLine; } else { ; } toPost += m_listQueueMessage[0].m_text + Environment.NewLine; if (m_listQueueMessage.Count == 1) { locking = m_listQueueMessage[0].m_bLockFile; } else { ; } m_listQueueMessage[0].m_state = STATE_MESSAGE.RUNNING; } } if (locking == true) { LogLock(); LogCheckRotate(); } else { ; } if (File.Exists(m_fileName) == true) { try { if ((m_sw == null) || (m_fi == null)) { //Вариант №1 //FileInfo f = new FileInfo(m_fileName); //FileStream fs = f.Open(FileMode.Append, FileAccess.Write, FileShare.Write); //m_sw = new LogStreamWriter(fs, Encoding.GetEncoding("windows-1251")); //Вариант №2 m_sw = new LogStreamWriter(m_fileName, true, Encoding.GetEncoding("windows-1251")); m_fi = new FileInfo(m_fileName); } else { ; } m_sw.Write(toPost); m_sw.Flush(); } catch (Exception e) { /*m_sw.Close ();*/ m_sw = null; m_fi = null; } } else { ; } //if (externalLog == true) //{ // if (timeStamp == true) // delegateUpdateLogText(DateTime.Now.ToString() + ": " + message + Environment.NewLine); // else // delegateUpdateLogText(message + Environment.NewLine); //} //else // ; lock (m_objQueueMessage) { m_listQueueMessage.RemoveAt(0); } if (locking == true) { LogUnlock(); } else { ; } } else { } break; case LOG_MODE.UNKNOWN: default: break; } } else { ; } if (indx_semathread == INDEX_SEMATHREAD.STOP) { break; } else { m_arEvtThread[(int)INDEX_SEMATHREAD.MSG].Reset(); } } }