Эффективность памяти: передача Html-кода страницы aspx через выделенный код

StackOverflow https://stackoverflow.com/questions/1548518

Вопрос

Моя цель — сгенерировать код aspx страницы в виде строки. Я вызываю приведенный ниже код кодовой части через асинхронный запрос в javascript и получаю ответ через Response.Write.

        string html = string.Empty;
        using (var memoryStream = new MemoryStream())
        {
            using (var streamWriter = new StreamWriter(memoryStream))
            {
                var htmlWriter = new HtmlTextWriter(streamWriter);
                base.Render(htmlWriter);
                htmlWriter.Flush();
                memoryStream.Position = 0;
                using (var streamReader = new StreamReader(memoryStream))
                {
                    html = streamReader.ReadToEnd();
                    streamReader.Close();
                }
            }
        }
        Response.Write(html);
        Response.End();

Я хочу спросить, является ли приведенный выше код эффективным с точки зрения использования памяти, я думаю о «выходности», которую можно использовать, поскольку он оценивается лениво. Можете ли вы предложить эффективность использования памяти в приведенном выше коде?

Это было полезно?

Решение

Используйте StringWriter вместо MemoryStream, StreamWriter и StreamReader:

string html;
using (StringWriter stream = new StringWriter()) {
   using (HtmlTextWriter writer = new HtmlTextWriter(stream)) {
      base.Render(writer);
   }
   html = stream.ToString();
}
Response.Write(html);
Response.End();

StringWriter внутренне использует StringBuilder.Метод ToString вызывает ToString в Stringguilder, поэтому он возвращает внутренний строковый буфер в виде строки.Это означает, что строка создается только один раз и не копируется туда и обратно.

Другие советы

Ваш метод сохраняет копию html по адресу html переменная и еще одна в memoryStream.Попробуй это:

base.Render(new HtmlTextWriter(Response.Output));
Response.End();

Хотя это может сработать, я не уверен, чего вы пытаетесь достичь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top