【问题标题】:How to improve ASP Literal control write performance如何提高 ASP Literal 控件写入性能
【发布时间】:2014-05-27 18:20:51
【问题描述】:

我正在开发一个需要以只读格式在文本文件中显示信息的 Web 应用程序。我已经使用字符串生成器和文字控件(已发布代码中的 litProgram)完成了此操作。我读取了文本文件,使用字符串生成器将其内容复制到一个新字符串中,然后将 Literal 控件的 Text 属性设置为我的新字符串。这是后面代码中的函数:

protected void viewCNC()
{
   // Clear any existing program text
   litProgram.Text = "";
   // Get Workcenter name for folder navigation
   string workcenter = gvDispatchList.SelectedRow.Cells[this.Master.getColumnID("WorkCenter", gvDispatchList)].Text;
   // Get program name from program list
   if (gvPrograms.SelectedRow != null)
   {
     string program = gvPrograms.SelectedRow.Cells[0].Text;

     // Change label
     lblProgramName.Text = program;

     // Read file
      using (StreamReader sr = new StreamReader("\\\\server\\CNCPrograms\\" + workcenter + "\\MasterPrograms\\" + program))
      {
          StringBuilder sb = new StringBuilder();
          while (!sr.EndOfStream)
          {
            sb.Append(sr.ReadLine());
            sb.Append("<br/>");
          }

          litProgram.Text = sb.ToString();

          upnlViewCNC.Update();
          modalViewCNC.Show();
       }
   }
   else
   {

       MessageBox msg = new MessageBox();
       msg.Alert("Please select a program.");
    }
}

这种方法效果很好,但是当我尝试从非常大的文件(超过 1000 KB)中显示文本时出现问题。随着文字文本的更新,有一个非常明显的滞后。我已经将减速追溯到“litProgram.Text = sb.ToString();”行。

我的问题是,这是一种很好的使用方法吗?我有什么方法可以加快速度吗?在用户等待应用完成将文本复制到文字时,延迟最多 2-3 秒是不可取的。

【问题讨论】:

  • string myString = sr.ReadToEnd().Replace(Environment.NewLine, "&lt;br /&gt;");
  • 很可能是由于将近 1MB 的数据传输回客户端造成的。当浏览器一次性渲染大型 html 简介时,也可能会有延迟。一种优化是在服务器上缓存文本文件的内容,而不是每次都检索它

标签: c# asp.net


【解决方案1】:

StringBuilder.ToString() 生成一个新字符串,您有 2 个操作 a) 创建一个新字符串 b) 将其分配给文字控件

litProgram.Text = sb.ToString();

为了确保 Literal 很慢

string s = sb.ToString();
litProgram.Text = s;

并将其与您之前的测量值进行比较。

这里也一样

while (!sr.EndOfStream)
{
    sb.Append(sr.ReadLine());
    sb.Append("<br/>");
}

根据this comparison,这样做可能是有意义的

string s = String.Empty;
while ((s = sr.ReadLine()) != null)
{
    sb.Append(s);
    sb.Append("<br/>");
}

我认为,您的代码看起来不错,如果您担心性能,您可以检查一下是否真的需要一次性返回 1M 的数据。仅返回前 100K 并放置滚动或“阅读更多”按钮并按需加载其余文件。

【讨论】:

  • 感谢您的建议!我最终像您在答案末尾提到的那样逐个返回数据。这本身就是一个有趣的问题,但现在效果很好。
猜你喜欢
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多