ureachnag Ответов: 4

Запись журнала просмотра событий служб Windows дважды.


Я создал службу windows, которая должна работать в течение очень 2 минут, чтобы получить RSS-каналы и сохранить их в базе данных. У меня нет никакой возможности отлаживать сервис из - за таймера, когда я проверяю журнал просмотра событий и базу данных, сервис работает хорошо, но проблема с сообщениями журнала просмотра событий, он пишет дважды, например, в 20.08.2012 5:57:17 вечера-обновляется с 6 записями, и я вижу, что с той же отметкой времени с 0 записями.

Любой орган, пожалуйста, помогите решить эту проблему, я не знаю, работает ли служба дважды или записывает журнал событий дважды.


---**** Я заметил, что ServiceTimer_Tick звонит дважды, я подключил процесс и сделал отладку.
Это моя функция _Tick.

private void ServiceTimer_Tick(object sender, System.Timers.ElapsedEventArgs e)
      {
          try
          {
              lock (thisLock)
              {
                  if (TickerCounter > 1)
                  {
                      //tmrTimer.Enabled = true;
                      DateTime DBmaxPubdate = dbobj.GetMaxDate();
                      DateTime Currentpubdt = new DateTime();
                      RSSXMLLoad();
                      // this.eventLogObj.WriteEntry("RSSXMLLoad Completed");
                      Currentpubdt = GetMaxPubDateFromXML();
                      int dateresult = DateTime.Compare(MaxPubDate, DBmaxPubdate);
                      if (dateresult >= 0)
                      {
                          //this.eventLogObj.WriteEntry("RSS URL Service Timer Tick calling to SaveRSSToDB()");
                          //Thread processingThread = new Thread(SaveRSSToDB);
                          //processingThread.Start();

                          SaveRSSToDB();
                      }
                      //this.eventLogObj.WriteEntry("RSS URL Service: Scheduled Execution Completed.", EventLogEntryType.Information, 9, 1);
                      //tmrTimer.Enabled = true;
                  }
                  else
                  {
                      TickerCounter++;
                  }
              }
          }
          catch (Exception Ex)
          {
              this.eventLogObj.WriteEntry("RSS URL Service Timer Tick: Error Occured." + Environment.NewLine + Ex.Message + Environment.NewLine + Ex.StackTrace, EventLogEntryType.Error, 6, 2);
          }
      }



Ценю вашу помощь,
Пилить

Sergey Alexandrovich Kryukov

Недостаточно информации, чтобы проанализировать его на очень конкретном уровне, поэтому вы можете получить некоторые общие советы.
--СА

[no name]

Вероятно, более вероятно, что ваше событие таймера упреждается. А потом бегать дважды, когда он вообще способен бегать.

4 Ответов

Рейтинг:
1

Clifford Nelson

Если вы считаете, что у вас могут быть запущены два экземпляра, вы можете получить идентификатор процесса с помощью Process класс в System.Diagnostics:

var p = Process.GetCurrentProcess();
var id = p.Id;


Добавьте это к тому, что вы записываете в журнал.


Sergey Alexandrovich Kryukov

Иногда этот прием бывает полезен, эту информацию можно добавить в журналы; мой 5.
--СА

Clifford Nelson

Определенно не весь ответ, в отличие от вашего. Спасибо за голосование.

ureachnag

@Сергей Александрович Крюков, большое вам спасибо за ваш ответ, Я действительно отлаживал код, подключаясь к процессу, я заметил, что _Ticker звонит дважды. Я вставил код, буду признателен, если вы мне поможете ..
Спасибо,
Пилить

Sergey Alexandrovich Kryukov

Пилить,
Добро пожаловать, но если вы хотите, чтобы я заметил ваше сообщение, пожалуйста, разместите его в качестве ответа на мой комментарий или решение, а не Клиффорда.
Кроме того, я думаю, что вы можете принять ответ формально (зеленая кнопка). Я бы посоветовал вам принять и Клиффорда, и меня-спасибо.
--СА

Member 9129971

У меня также есть эта проблема , и когда я добавил идентификатор процесса, то он показывает один и тот же идентификатор процесса в обоих случаях.

Member 9129971

есть ли какой-нибудь способ, с помощью которого я могу получить запущенные таймеры обслуживания

Рейтинг:
1

ureachnag

Я решил эту проблему, я заметил, что после InitializeComponent();
Я вызываю нижеприведенные строки кода.

string[] args = { };

this.OnStart(args);


Как только я прокомментировал эти строки, все сработало нормально.

Большое спасибо Сергею Александровичу Крюкову и Клиффорду за вашу помощь.

С уважением,
Пилить


Рейтинг:
1

Craig Gers

У меня была та же проблема, однако причиной моего дублированного ведения журнала (который происходил внутри события) было то, что в моем файле NLog.config у меня было два правила для регистратора.

Выписка из моего XML-файла журнала NLog была следующей, и я допустил ошибку, добавив второе правило (не показанное ниже), которое ссылалось на целевой файл журнала имен - то есть:

<logger name="*" minlevel="Info" writeTo="logfile" />


Если вы хотите, чтобы он регистрировался один раз и использовал AsyncWrapper, ваше правило должно ссылаться только на асинхронную оболочку, а не на вложенный целевой объект.

Мой фиксированный Nlog.config был примерно таким.

<targets>
  <target xsi:type="AsyncWrapper" name="asyncFile" overflowAction="Discard" queueLimit="10000" batchSize="200" timeToSleepBetweenBatches="1">
  <target   name="logfile"
            xsi:type="File"
            fileName="${var:logDirectory}/smarttracdesktop.log"
            archiveFileName="${var:logArchiveDirectory}/smarttracdesktop.{#}.log"
            archiveEvery="Day"
            archiveNumbering="Date"
            archiveDateFormat="yyyyMMdd"
            maxArchiveFiles="60"
            concurrentWrites="true"
            keepFileOpen="false"
            encoding="utf-8"
            layout="${var:defaultLayout}" />
  </target>
  <target name="logconsole" layout="${var:defaultLayout}" xsi:type="Console" />
</targets>
<rules>
  <logger name="*" minlevel="Info" writeTo="asyncFile" />
</rules>


Richard Deeming

ОП явно не использовал NLog - тем более что он был выпущен только через год после публикации этого вопроса.

Рейтинг:
0

Sergey Alexandrovich Kryukov

В этом и заключается вся цель протоколирования — выявить проблемы. Если он регистрируется дважды, это означает, что контекст кода, вызывающий этот журнал, вызывается дважды. Если это не должно быть так, мои поздравления: вы правильно использовали ведение журнала, так что это уже помог вам обнаружить дефект Теперь внесите дополнительную информацию в журналы и узнайте, как это исправить. Один практический совет: в рассматриваемом фрагменте кода Вы можете проверить, где он вызывается на разных этапах выполнения вашего приложения, изучив стек вызовов в этих точках, в случае, если нет исключений для дампа. Для этого, пожалуйста, воспользуйтесь классом System.Diagnostics.StackTrace:
http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace%28v=vs.100%29.aspx[^].

Узнайте больше о возможностях компании System.Diagnostics; они очень полезны:
http://msdn.microsoft.com/en-us/library/system.diagnostics%28v=vs.100%29.aspx[^].

В большинстве случаев вы должны иметь возможность использовать отладчик. Журнал событий используется в основном в тех случаях, когда отладка слишком сложна или сеанс отладки недоступен для вас, например, если процесс выполняется только в местоположении вашего клиента, которое находится вне вашего контроля. Лучше всего делать столько отладки, сколько вы можете, используя отладчик на каком-нибудь компьютере разработки.

Это все, что я могу посоветовать, основываясь на вашей ограниченной информации. Однако вы можете задать несколько дополнительных вопросов.

Удачи,

—СА