Обнаружена странная проблема с этим событием, оболочкой и обработчиком событий:
public delegate void StatusUpdateHandler(string message, Exception exc, SeverityLevel severity);
public event StatusUpdateHandler StatusUpdate;
private void FireStatusUpdate(string message)
{
if (this.StatusUpdate != null)
this.StatusUpdate(message, null, SeverityLevel.None);
}
void scanDocProcessor_StatusUpdate(string message, Exception exc, SeverityLevel severity)
{
try
{
if (exc != null)
{
if (severity >= setSevLevel)
this._logger.Log(message + Environment.NewLine + exc.ToString(), LogEntryType.Emergency, "OCR Submission Processor Status Update", true);
else
this._logger.Log(message + Environment.NewLine + exc.ToString(), LogEntryType.Error, "OCR Submission Processor Status Update", false);
}
else if (severity >= setSevLevel)
{
this._logger.Log(message, LogEntryType.Info, "OCR Submission Processor Status Update", true, true);
}
else
this._logger.Log(message, LogEntryType.Info, "OCR Submission Processor Status Update", false);
}
catch (Exception)
{
EventLog.WriteEntry("Russia OCR Submission Processor", "Could not log status update event: " + exc.ToString(), EventLogEntryType.Information);
}
}
В течение нескольких минут _logger прекратил регистрировать сообщения, и вместо этого я получил эти сообщения в журнале событий:
Не удалось записать событие обновления состояния: System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта.
в ScannedService.scanDocProcessor_StatusUpdate (строковое сообщение, исключение исключение, серьезность SeverityLevel)
в ScannedService.Processor.FireStatusUpdate (строковое сообщение)
в ScannedService.Processor.ProcessQueue (Object Object)
Я запутался, как журнал событий мог получить такую трассировку стека, когда он должен писать exc.ToString (). Я посмотрел на IL для метода scanDocProcessor_StatusUpdate, который не инициализирует объект Exception. Кроме того, я не знаю, как возникает исключение nullreference. Когда метод Log перехватывает исключение, он проглатывает его или перебрасывает с помощью команды throw; Параметр сообщения никогда не является нулевым, а SeverityLevel является перечислением.