无法从asp.net应用程序中的封闭TextReader实例中读取

时间:2015-03-11 13:33:28

标签: c# asp.net textreader

我正在运行ASP 4.5应用程序。其中一个页面用户必须回答几个问题并按下按钮才能完成测试。我的应用程序使用文本文件来分析用户的答案。如果用户快速完成所有操作,应用程序运行正常,但是当他花费更长时间20分钟完成测试时我得到了一个例外

  

无法从已关闭的TextReader中读取

我不明白什么是错的,因为我只在按下按钮时打开StreamReader。这是我的代码的一部分:

 protected void Page_Load(object sender, EventArgs e)
 {
    if (!IsPostBack)
    {
        GlobalVariables.surname = Request.QueryString["surname"];
        GlobalVariables.name = Request.QueryString["name"];
        GlobalVariables.gender = Request.QueryString["gender"];
        GlobalVariables.age = int.Parse(Request.QueryString["age"]);
    } 
    Label1.Width = 700;
    Button1.Click += new EventHandler(this.Button1_Click);
 }

 void Button1_Click(Object sender, EventArgs e)
 {
    var f0= new FileStream(Server.MapPath("./key.txt"), FileMode.Open, FileAccess.Read);
    StreamReader sr = new StreamReader(f0); 
    //..... 
    sr.Close();
    sr.Dispose();
  }

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

  

当他需要更长的20分钟才能完成测试时我会得到一个例外

这听起来很像他们的会话过期了。要解决此问题,我建议添加一些javascript来为Web服务器建立心跳。心跳将使会话保持活力;除了每分钟左右发出一次请求之外,它不需要做任何事情,所以服务器知道你还在那里。

答案 1 :(得分:1)

除了Joel的回答,我建议将处理文件与阅读文件分开。

List<string> lines = new List<string>();
using (var f0 = new FileStream(Server.MapPath("./key.txt"), FileMode.Open, FileAccess.Read))
{
    string line;
    using (StreamReader reader = new StreamReader(f0))
    {
        while ((line = reader.ReadLine()) != null)
        {    
            lines.add(line);
        }
    }
}

// it would need to be a very big text file to be a memory issue
// do your processing here

答案 2 :(得分:-1)

如果页面不是回帖,您可能希望设置页面,因为它应该在第一次查看。我还建议甚至在if(!Page.IsPostBack)中移动按钮单击以及在回发之前需要设置的任何内容。将你的Stream阅读器移动到其他地方...就像这样if(!Page.IsPostBack)else {stream reader stuff}并删除按钮点击,因为按钮会导致回发。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        GlobalVariables.surname = Request.QueryString["surname"];
        GlobalVariables.name = Request.QueryString["name"];
        GlobalVariables.gender = Request.QueryString["gender"];
        GlobalVariables.age = int.Parse(Request.QueryString["age"]);
        Label1.Width = 700;
    }
    else
    {
        DoPostBackStuff();
    }
}

private void DoPostBackStuff()
{
    var f0= new FileStream(Server.MapPath("./key.txt"), FileMode.Open, FileAccess.Read);
    StreamReader sr = new StreamReader(f0); 
    //..... 
    sr.Close();
    sr.Dispose();
}