У меня есть тестовый код, который готовит MemoryStream
, который в конечном итоге будет считаться объектом. Вот как я хочу, чтобы писать:Почему StreamWriter должен быть открыт для доступа к моему MemoryStream?
var manager = new LeaderboardImportManager(leaderboard);
var columnNames = manager.ColumnNames;
var stream = new MemoryStream();
using (var writer = new StreamWriter(stream))
{
writer.WriteLine(string.Join(",", columnNames));
foreach (var user in users)
{
var row = leaderboard.Metrics.Select(m => Faker.RandomNumber.Next().ToString()).ToList();
row.Insert(0, user.UserName);
writer.WriteLine(string.Join(",", row));
}
writer.Flush();
stream.Position = 0;
}
return stream;
Но когда я делаю это таким образом, мой объект поток становится нечитаемым, и мой тест не пройден, так что я должен сделать это следующим образом:
var manager = new LeaderboardImportManager(leaderboard);
var columnNames = manager.ColumnNames;
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.WriteLine(string.Join(",", columnNames));
foreach (var user in users)
{
var row = leaderboard.Metrics.Select(m => Faker.RandomNumber.Next().ToString()).ToList();
row.Insert(0, user.UserName);
writer.WriteLine(string.Join(",", row));
}
writer.Flush();
stream.Position = 0;
return stream;
Это, конечно, мешает мне избавиться от моего объекта StreamWriter
, который, как я понимаю, обязательно должен быть уничтожен.
Почему StreamWriter
должен оставаться открытым, если я уже сбросил его содержимое на объект MemoryStream
?
Я могу придумать некоторые очень неудобные способы обойти это, но я хотел бы знать, почему это не работает так, как я этого хочу, и есть ли что-то, что я могу сделать, чтобы заставить его работать путь. Любые советы приветствуются, спасибо!
Если вы предпочитаете не передавать дополнительные аргументы, вы можете использовать 'GetBuffer' вместо' ToArray'. 'GetBuffer' возвращает внутренний буфер напрямую и представляет собой простую управляемую память и, таким образом, доступен даже после того, как расположен« MemoryStream ». «ToArray» делает копию данных, которые могут приводить к проблемам производительности и памяти в зависимости от размера ваших данных и вашего конкретного сценария. –
Спасибо, я посмотрю. – Samo