イントラネットで使用するファイルプロセッサを作成しています。別の質問で説明しました-C#を使用してASP.Netで多数のファイルを処理する場合のERR_EMPTY_RESPONSE
さて、上記の質問の答えで示唆されているように、私はスレッドを使用してファイル処理タスクを実行しようとしています。
しかし問題がある。ページ内のコンポーネント(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週間研究しています)。助けてください!