Отладка в Visual Studio: программа зависает при выполнении тяжелого цикла - PullRequest
1 голос
/ 26 января 2010

В настоящее время я пытаюсь извлечь файл, сжатый с помощью GZip. Я хочу сделать это программно на мобильном устройстве с использованием Windows Mobile 6. Я использую Compact Framework 3.5 и C #.

Размер сжатого файла составляет около 4 МБ. И размер исходного файла (который является текстовым файлом) составляет около 42 МБ. Мой алгоритм падает при извлечении. Каждый раз происходит сбой, когда размер распакованного файла достигает примерно 33,2 МБ.

Мой алгоритм дает сбой из-за ограничения размера файла? Я знаю, что компактный каркас имеет ограничение памяти около 32 МБ, но этот предел памяти не должен соблюдаться, учитывая, что я использую буферы для извлечения файла. Я прав?

Вот алгоритм:

private void Extract(string GZippedFile, string TargetFile)
{
  int BUFFER_SIZE = 32768;

  using (FileStream InStream = new FileStream(GZippedFile, FileMode.Open, FileAccess.Read))
  {
    using (GZipStream GZipStream = new GZipStream(InStream, CompressionMode.Decompress))
    {
      using (FileStream OutStream =
        new FileStream(TargetFile, FileMode.Create, FileAccess.Write))
      {
        byte[] tempBytes = new byte[BUFFER_SIZE];
        int i;
        while ((i = GZipStream.Read(tempBytes, 0, tempBytes.Length)) != 0)
        {
          OutStream.Write(tempBytes, 0, i);
        }
      }
    }
  }
}

Кроме того, обычно при достижении предела памяти в Windows Mobile отображается системное сообщение. Это не тот случай, когда эта программа падает.

Кроме того, на устройстве достаточно памяти и программной памяти (отображается в меню «Настройки» >> «Память в системе»).

У вас есть идеи?

РЕДАКТИРОВАТЬ: Извините, я думаю, что я был не прав. Фактически эта проблема возникала только тогда, когда я отлаживал программу с помощью Visual Studio. И я использую TCp / Connect для связи Visual Studio и моего устройства.

Я думаю, что настоящая проблема заключается в следующем:

  • извлечение файла занимает много ресурсов устройства;

  • , поскольку устройство слишком занято, оно не может поддерживать соединение tcp с Visual Studio;

  • соединение между Visual Studio и устройством потеряно, что приводит к сбою всей программы без предупреждения пользователя на устройстве (на ПК, на котором работает Visual Studio, отображается сообщение, предупреждающее, что соединение было потеряно).

Когда я не использую отладчик visual studio, все работает просто отлично.

РЕДАКТИРОВАТЬ: Из-за комментария ctackle проблема больше не появляется. Совет должен выполнить

System.Threading.Thread.Sleep(1);

Эта инструкция дает дескриптор Visual Studio во время цикла и предотвращает сбой программы.

1 Ответ

0 голосов
/ 28 января 2010

Может быть, рассмотреть возможность использования стороннего инструмента?

http://www.icsharpcode.net/OpenSource/SharpZipLib/

...