базовое понимание потокового писателя - PullRequest
0 голосов
/ 11 ноября 2010

HI,

Мой вопрос связан с базовым пониманием записи данных с использованием StreamWriter. Если вы считаете следующий код:

            StreamWriter writer = new StreamWriter(@"C:\TEST.XML");
            writer.WriteLine("somestring");
            writer.Flush();
            writer.Close();

Когда объект записи инициализируется с именем файла, все, что у него есть, это указатель на файл.

Однако когда мы записываем какую-либо строку в объект записи, действительно ли он ЗАГРУЗИТ весь файл, прочитает его содержимое, добавит строку в конец и затем закроет дескриптор?

Надеюсь, это не глупые вопросы. Я спрашиваю об этом, потому что я столкнулся с приложением, которое часто пишет, вероятно, каждые полсекунды в файл, и размер файла увеличился примерно до 1 ГБ, и он все еще продолжал записывать в файл. (Каротаж)

Как вы думаете, это могло привести к загрузке процессора на 100%?

Пожалуйста, дайте мне знать, если мой вопрос неясен?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 12 ноября 2010

действительно ли он загружает весь файл, читает его содержимое

После того как каркас откроет файл, он выполнит операцию FileStream.Seek для позиционированияуказатель файла в конец файла.Это поддерживается операционной системой и не требует чтения или записи каких-либо данных файла.

и затем закрывает дескриптор

Дескриптор закрывается при вызове Close или Dispose.Оба эквивалентны.(Обратите внимание, что для удобства вы можете воспользоваться оператором C # using , чтобы создать область, в которой вызов Dispose обрабатывается компилятором при выходе из области.)

каждые полсекунды для файла

Звучит недостаточно часто, чтобы загрузить машину на 100%.Тем более, что дисковый ввод-вывод в основном состоит из ожидания на диске, и этот вид ожидания не способствует загрузке процессора.Используйте профилировщик, чтобы увидеть, где ваше приложение тратит свое время.В качестве альтернативы, простой метод, который вы можете попробовать, - это запустить под отладчиком, щелкнуть паузу и изучить стеки вызовов ваших потоков.Существует большая вероятность того, что метод, занимающий много времени, будет в стеке при случайной приостановке приложения.

0 голосов
/ 12 ноября 2010

Приведенный выше код перезапишет содержимое файла, поэтому нет необходимости загружать файл заранее.
Тем не менее, вы можете добавить файл, сказав:

StreamWriter writer = new StreamWriter(@"C:\TEST.XML", true);

Параметр true указывает ему добавить файл.
И, тем не менее, он не загружает весь файл в память перед тем, как добавить к нему.
Это то, что делает это "потоком",означает, что если вы идете в одну сторону, вы идете в одну сторону.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...