2010-11-11 8 views
0

HI,Основное понимание писателя потока

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

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

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

Однако, когда мы записываем какую-либо строку в объект записи, действительно ли она загружает весь файл, читает его содержимое, добавляет строку в конец и закрывает дескриптор?

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

Считаете ли вы, что это могло привести к использованию процессора на 100%?

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

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

+0

, если не было много потоков, пытающихся записать в тот же файл нет, это не вызовет 100% использования ЦП. –

+0

, даже если бы он загружал весь файл, я бы не ожидал 100% использования ЦП, так как я ожидал бы, что он будет привязан к IO – 2010-11-11 23:41:56

ответ

3

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

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

, а затем закройте ручку

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

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

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

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^