ディレクトリ内の 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 にデータを送信する方法を見つける必要があります。