Вам необходимо заключить объект TextWriter
в блок using
.
List<Manufacturer> mList = ManuImport.GetManufacturers();
using(TextWriter tw = new StreamWriter(@"C:\manu.txt"))
{
foreach (Manufacturer manu in mList)
{
//Output name to txt file.
tw.WriteLine(manu.ManufacturerName);
Console.WriteLine(manu.ManufacturerName);
Console.WriteLine(manu.ShortManufacturerName);
Console.WriteLine(manu.ManufacturerDirectory);
Console.WriteLine(manu.ManuId);
Console.WriteLine("------------------------");
}
}
Для этого есть две причины:
Во-первых, принципиально, TextWriter
реализует IDisposable
, что означает, что вы должны всегда вызывать Dispose()
, когда закончите работу с объектом.Блок using
в C # и VB.NET является языковым механизмом для обеспечения вызова Dispose
.Это верно для всех объектов, которые реализуют IDisposable
, поэтому, вероятно, будет хорошей идеей взглянуть на другие области вашего кода и другие объекты инфраструктуры, которые вы используете, чтобы убедиться, что вы следуете этому шаблону.Некоторые вещи, на которые вы могли бы обратить особое внимание:
- Соединения с базой данных
- Все, что связано с вводом-выводом (файлы, потоки любого типа и т. Д.)
Во-вторых, для этого конкретного случая класс TextWriter
буферизует записываемые данные (так, например, если вы записываете данные по символу за раз, у вас нет дискового ввода-вывода для КАЖДОГО символа, так как онделает это "кусками").В результате буфер должен быть очищен для записи данных на диск.Это происходит в трех случаях:
- Буфер заполняется при использовании объекта в коде
- Вы закрываете
TextWriter
либо вызывая Close()
или Dispose()
- Вы вручную очищаете буфер, вызывая
Flush()
Первый, который вы не можете контролировать, так как он автоматический.Последнее должно быть исключительным случаем, когда вы хотите, чтобы все буферизованные данные были немедленно записаны на диск, но при этом все равно нужно было оставить запись открытой.Второй случай - самый важный - это то, что вам не хватает.