我正在创建一个用于 Intranet 的文件处理器。我在另一个问题中描述了它 - ERR_EMPTY_RESPONSE 使用 C# 在 ASP.Net 中处理大量文件时
现在,正如上述问题的答案所建议的,我正在尝试使用线程来执行文件处理任务。
但有一个问题。我需要新创建的线程将反馈写入页面中的组件(asp:panel 或 div 或其他)。这些反馈将是几个数据库操作的结果。
应用程序读取这些 txt,解释其中的每一行,并将数据插入数据库。插入数据库的每一行都必须返回一个反馈,例如“成功插入注册表 'regname'”或“我在文件 'filename' 中插入注册表 'regname' 时遇到问题,跳到下一个注册表”。
我做了一些非常简单的测试:
protected void DoImport()
{
try
{
MainBody.Style.Add(HtmlTextWriterStyle.Cursor, "wait");
int x = 0;
while (x < 10000)
{
ReturnMessage(String.Format("Number {0}<hr />", x), ref pnlConfirms);
x++;
}
}
catch (Exception ex)
{
ReturnMessage(String.Format("<font style='color:red;'><b>FATAL ERROR DURING DATA IMPORT</b></font><br /><br /><font style='color:black;'><b>Message:</b></font><font style='color:orange;'> {0}</font><br />{1}", ex.Message, ex.StackTrace), ref pnlErrors);
}
finally
{
MainBody.Style.Add(HtmlTextWriterStyle.Cursor, "default");
}
}
该函数从 Page_Load 调用,并在加载时用一行数字填充名为“pnlConfirms”的 asp:panel。
我将其更改为:
protected void DoImport()
{
try
{
MainBody.Style.Add(HtmlTextWriterStyle.Cursor, "wait");
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork));
}
catch (Exception ex)
{
ReturnMessage(String.Format("<font style='color:red;'><b>FATAL ERROR DURING DATA IMPORT</b></font><br /><br /><font style='color:black;'><b>Message:</b></font><font style='color:orange;'> {0}</font><br />{1}", ex.Message, ex.StackTrace), ref pnlErrors);
}
finally
{
MainBody.Style.Add(HtmlTextWriterStyle.Cursor, "default");
}
}
private void DoWork(Object stateInfo)
{
int x = 0;
while (x < 10000)
{
ReturnMessage(String.Format("Number {0}<hr />", x), ref pnlConfirms);
x++;
}
}
两者都使用此功能:
public void ReturnMessage(string message, ref Panel panel, bool reset = false)
{
if (reset)
{
panel.Controls.Clear();
}
Label msg = new Label();
msg.Attributes.Add("width", "100%");
msg.Text = message;
panel.Controls.Add(msg);
}
我需要ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork));
用反馈填充这些 asp:panels - 比如插入错误和警告。
我的代码已经在try...catch
语句下有这些反馈,但是它们没有从线程池中获取任何 asp:panel 的输出(当直接从DoImport()
函数调用时,它可以工作,就像我发布的第一个示例一样)。
我做错了什么,但我不知道是什么(我研究了将近 2 周)。请帮忙!