Обновление: После просмотра журнала событий примерно в то время, когда это произошло, я получаю сообщение: «Серверу не удалось выделить из системного невыгружаемого пула, поскольку пул был пуст. " повторяется непрерывно по всему журналу, пока он не будет перезагружен.
Я пишу класс, который записывает отладочную информацию в файл, до сих пор класс работал нормально, однако сейчас я начинаю стресс-тестирование моего приложения (запустив его в 1000 раз быстрее, чем обычно), и это имеет вызвало необычную ошибку.
Проблема, с которой я сталкиваюсь, заключается в том, что после длительного периода времени (4 часа и более) мое приложение вылетает и, похоже, удаляет Windows; Я больше не могу открыть Windows Explorer или любое другое приложение. Перезагрузка системы, кажется, решает проблему, однако, когда я делаю файл, в который я пишу, пуст.
Это заставляет меня думать, что, возможно, проблема связана с дескрипторами открытых файлов; возможно, Windows как-то достигает своего предела количества открытых файловых дескрипторов?
Итак, здесь возникает связанный с этим вопрос; Вот основная функция, которая записывает данные в файл. Как видите, объекты FileStream и BinaryWriter создаются при каждом вызове этой функции, заключаются в операторы, чтобы обеспечить их правильное закрытие / удаление.
/// <summary>
/// This is called after changing any
/// stats data, or on initial startup.
/// It saves the current stats to file.
/// </summary>
public void UpdateStatsData()
{
lock (this.lockObject)
{
using (FileStream fileStream = new FileStream(Constants.StatsFile, FileMode.Create, FileAccess.Write, FileShare.None, 128, FileOptions.WriteThrough))
{
using (BinaryWriter binWriter = new BinaryWriter(fileStream))
{
binWriter.Write(this.serverStats.APM);
binWriter.Write(this.serverStats.AverageJackpotWin);
binWriter.Write(this.serverStats.AverageWinnings);
binWriter.Write(this.serverStats.NumberOfGamesPlayed);
binWriter.Write(this.serverStats.NumberOfJackpots);
binWriter.Write(this.serverStats.RunningPercentage);
binWriter.Write(this.serverStats.SiteID);
binWriter.Write(this.serverStats.TotalJackpotsValue);
binWriter.Write(this.serverStats.TotalStaked);
binWriter.Write(this.serverStats.TotalWinnings);
}
}
}
}
Возможно ли, что эта функция при очень быстром вызове может вызвать медленное создание дескрипторов файлов и в конечном итоге превысить максимум Windows?
Возможное решение заключается в том, чтобы сделать объекты FileStream и BinaryWriter закрытыми переменными-членами класса, создать их в конструкторе, а затем перезаписать данные при каждом вызове.
.
/// <summary>
/// This should be called after changing any
/// stats data, or on initial startup.
/// It saves the current stats to a serialized file.
/// </summary>
public void UpdateStatsData()
{
lock (this.lockObject)
{
// Seek to the beginning of the file.
this.binWriter.BaseStream.Seek(0, SeekOrigin.Begin);
// Write the stats data over the existing data.
this.binWriter.Write(this.serverStats.APM);
this.binWriter.Write(this.serverStats.AverageJackpotWin);
this.binWriter.Write(this.serverStats.AverageWinnings);
this.binWriter.Write(this.serverStats.NumberOfGamesPlayed);
this.binWriter.Write(this.serverStats.NumberOfJackpots);
this.binWriter.Write(this.serverStats.RunningPercentage);
this.binWriter.Write(this.serverStats.SiteID);
this.binWriter.Write(this.serverStats.TotalJackpotsValue);
this.binWriter.Write(this.serverStats.TotalStaked);
this.binWriter.Write(this.serverStats.TotalWinnings);
}
}
Однако, хотя это может быть быстрее и означать использование только одного FileStream, как мне обеспечить, чтобы FileStream и BinaryWriter были закрыты / удалены должным образом при завершении работы приложения?