2

我正在运行一个 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();
  }

有人可以帮我吗?

4

3 回答 3

2

当他完成测试需要超过 20 分钟时,我得到一个例外

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

于 2015-03-11T14:31:29.107 回答
1

除了乔尔的回答之外,我还建议将处理文件与读取文件分开。

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
于 2015-03-11T15:01:30.960 回答
-1

如果该页面不是回发,您可能需要设置该页面,因为它应该是第一次查看。我还建议即使在 if(!Page.IsPostBack) 以及回发之前需要设置的任何内容中也可以移动按钮单击。将您的 Stream 阅读器移动到 else... 就像这样 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();
}
于 2015-03-11T13:56:34.260 回答