2

ディレクトリ内の 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 ファイルになります。

一部のフォルダーのみを選択する場合 (1 か月のすべてのフォルダーなど) に完全に機能します。ただし、たとえば、1 年分のファイル (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-06-21 の編集:

私は答えを見つけました。@BumbleBee によって提案された解決策は、メッセージを返したので、調査の開始点を与えてくれました。

このコンテキストでは、非同期操作は許可されていません。非同期操作を開始するページでは、Async 属性を true に設定する必要があり、非同期操作は PreRenderComplete イベントの前のページでのみ開始できます。

これを見つけました: 回答投稿のリンクに解決策があるASP.NET真の非同期操作( ThreadPool.QueueUserWorkItem uses 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]、キューの長さを返すaを配置し、ajaxで呼び出します。

必要に応じて、キャンセルボタンを追加することもできます。

UIは、この手法を使用して応答します。

于 2012-06-20T21:31:51.173 に答える