У меня есть базовый класс Animal
, который я использую в некоторых программах моделирования. В этом случае может быть до 500 Animal
с в прогоне. Каждый прогон настроен так, чтобы каждый Animal
делал что-то каждый шаг по времени. Поэтому я просто перебираю список животных, звоню DoTimeStep
на каждого из них, пока не будут выполнены все временные шаги для бега.
Каждый класс Animal
имеет свой собственный класс регистратора для записи данных для каждого "временного шага" в симуляции. Таким образом, каждый Animal
имеет свой собственный файл журнала. Он работал нормально всегда (3 года), пока мы не попытались запустить его на виртуальной машине. Тогда по какой-либо причине время от времени ссылка на регистратор будет нулевой для «временного шага», а затем в следующий раз она будет там. Действительно странная часть - StreamWriter
внутри регистратора, кажется, никогда не теряет местонахождение своего файла. Это просто пропускает запись строки для этого временного шага. И журнал ошибок показывает NullReferenceException
в классе Logger
.
Я не могу найти шаблон для этого поведения. Класс Animal
не был уничтожен и воссоздан. Регистратор создается в конструкторе Animal
и уничтожается в IDispose
. Любые идеи о том, как я бы начал отлаживать эту проблему?
Редактировать: Я могу воссоздать это будет только 3 животных, поэтому не должно быть 500 открытых файлов. Но спасибо за попытку.
Редактировать: Я не уверен, что я должен делать, когда улавливаю ошибку для Null Exception. Я его уже ловил, но не могу понять, как выяснить, почему это происходит. Извините за кажущиеся тупыми. Кроме того, я попробовал Thread.Sleep (300) для 10000 циклов, чтобы увидеть, происходит ли какая-то гонка, о которой я не знал. Он никогда не становился не нулевым в цикле. Но через 3 секунды, когда я перебрал двух других животных и вернулся, он больше не был нулевым.