2

我创建了一个 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 的方法。

4

2 回答 2

3

您可能想更改 RequestTimeout 并查看。

<httpRuntime executionTimeout="some big value here"  />

检查示例

但这实际上并不是解决您问题的真正方法。您需要启动一个后台线程并让它处理大型处理并让 UI 线程返回一条消息给用户。是一个如何实现这一目标的示例。

于 2012-06-20T21:27:13.447 回答
0

不要在后面的页面代码中做如此繁重的工作。将作业推送到单独的队列中,该队列将在可能的情况下在单独的线程中执行作业。

基本上,单击按钮应该“解雇并忘记”这项工作。

如果你需要一个进度条,放一个[WebMethod]会返回队列长度的,然后用ajax调用它。

如果需要,您还可以添加取消按钮。

UI 将使用此技术进行响应。

于 2012-06-20T21:31:51.173 回答