我正在运行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();
}
有人可以帮帮我吗?
答案 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();
}