【发布时间】:2012-07-06 19:11:20
【问题描述】:
我正在创建一个用于 Intranet 的文件处理器。 我在另一个问题中描述了它 - ERR_EMPTY_RESPONSE when processing a large number of files in ASP.Net using C#
现在,正如上述问题的答案所建议的,我正在尝试使用线程来执行文件处理任务。
但是有一个问题。我需要新创建的线程将反馈写入页面中的组件(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 周)。请帮忙!
【问题讨论】:
标签: c# multithreading