我创建了一个 Intranet 系统来处理目录中的 TXT 文件并将其数据处理到 SQL Server 数据库中。它是递归的,所以我有一个这样的文件结构:
C:\RawData\2012_06_01\2012_06_01_0002144493.txt C:\RawData\2012_06_01\2012_06_01_0002954412.txt
...
C:\RawData\2012_06_15\2012_06_15_0012554778.txt
依此类推,总计约 10.530 个文件。
当只选择一些文件夹(比如一个月的所有文件夹)时,它可以完美地工作。但是,当尝试处理一年的文件(从 2011_06_01 到 2012_06_01)时,它开始处理,然后我收到这个 ERR_EMPTY_RESPONSE 错误。它与连接无关,因为它发生在 VS2010 引擎下(我只是运行代码,它打开浏览器,我选择所有我想要的文件夹 - 在 Web 界面上 - 然后单击“处理”按钮)。
通过在循环下执行循环来进行处理,例如以下示例:
string[] folders = Directory.GetDirectories(parentFolder);
foreach (string folder in folders)
{
string[] files = f.GetFilesRecursive(@folder);
foreach (string file in files)
{
if (File.Exists(file))
{
string buffer = "";
StreamReader sr = File.OpenText(file);
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
buffer += line;
// All the internal file processing and database calls goes here
} // while
sr.Close();
} // if file exists
} // foreach (files)
} // foreach (folders)
此代码是原始代码的简化版本。内部文件处理代码非常大,涉及类、数据库对象等,但它们运行良好(文件很少,最多 300 个左右,运行完美)。
有没有办法避免这个错误,或者有什么关于优化文件处理的其他方法的建议?
另外(最重要的是),我想实现一个 ajax 响应,所以用户可以看到一个百分比条或类似的东西......我听说过 ICallbackEventHandler 和 IPostBackEventHandler,但我不知道如何实现这个在我使用的这样的循环下。
任何事情都会非常感激。
编辑于 2012 年 6 月 21 日:
我找到了答案。@BumbleBee 建议的解决方案给了我一个研究的起点,因为它返回了消息:
在此上下文中不允许异步操作。启动异步操作的页面必须将 Async 属性设置为 true,并且只能在 PreRenderComplete 事件之前的页面上启动异步操作。
发现这个:ASP.NET 真正的异步操作 ,它在答案帖子中的链接上有解决方案(ThreadPool.QueueUserWorkItem 使用 ASP.Net)
现在,我只需要找到一种使用 AJAX 将数据发送到页面上的 3 个 Div 的方法。