9

完了率を示すプログレス バーとキャンセル ボタンを備えたバックグラウンド タスクを実行する必要があります。タスクの詳細はさておき、今のところ、例を機能させたいだけなので、3 つのメイン イベント ハンドラー (DoWork、ProgressChanged、および RunWorkerCompleted) と、カウンターをインクリメントして DoWork で 50 ミリ秒スリープするだけのループを用意します。ただし、最後の1回を除いて更新されません。

Windows フォームでは、バックグラウンド ワーカーを使用していますが、問題なく正しく機能します。この同じコードを使用したいと思います。ただし、ASP.NET が同じ機能を得るには AJAX を使用する必要があるという内容を見てきました。だから私の質問は:

1) バックグラウンド ワーカーを使用するために本当に AJAX が必要ですか?

2)はいの場合、AJAX が必要です。AJAX について何も知らない人が、ASP.NET Web ページでバックグラウンド ワーカーを起動して実行するためにできる最も簡単で最も簡単な方法は何ですか?

3)いいえの場合、AJAX は必要ありません。AJAX を使用していない作業サンプルを教えてもらえますか? バックグラウンドワーカー以外のスレッド化方法を使用していても興味があります。

マルチパートの質問で申し訳ありません!どちらかでお答えいただけると助かります。それが機能する限り、最終的にどの方法を使用するかはあまり気にしません。

.cs ページからの参照用コード:

 protected void bwProcess_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 { 
     lblProgress.Text = "Task Complete: " + e.Result;
 }

 protected void bwProcess_ProgressChanged(object sender, ProgressChangedEventArgs e)
 {
     lblProgress.Text = e.ProgressPercentage.ToString();
 }

 protected void bwProcess_DoWork(object sender, DoWorkEventArgs e)
 {
     for (int i = 0; i <= 100; i++)
     {
         if (bwProcess.CancellationPending)
         {
             lblProgress.Text = "Task Cancelled.";
             e.Cancel = true;
             return;
         }
         bwProcess.ReportProgress(i);
         Thread.Sleep(50);
     }
     e.Result = "100%";
}

protected void BWClick(object sender, EventArgs e)
{
    lblProgress.Text = "Firing Process...";
    bwProcess = new BackgroundWorker();
    bwProcess.WorkerReportsProgress = true;
    bwProcess.WorkerSupportsCancellation = true;
    bwProcess.DoWork += new DoWorkEventHandler(bwProcess_DoWork);
    bwProcess.ProgressChanged += new ProgressChangedEventHandler(bwProcess_ProgressChanged);
    bwProcess.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwProcess_RunWorkerCompleted);

    if (bwProcess != null)
    {
        bwProcess.RunWorkerAsync("StartAsynchronousProcess");
    }
}

その他のメモ: Async="True" と EnableSessionState="ReadOnly" を @Page に入力しました。

前もって感謝します!

4

1 に答える 1

7

Web プログラミングは、デスクトップ プログラミングでは当然のことと考えがちな多くの課題を提供します。ある場所から別の場所に移動するには、多くの変更が必要になる場合があります。長期実行スレッドの生成は、落とし穴を避けるために注意が必要なことの 1 つです。アプリケーション プールは、生成されたスレッドを認識しないため、リサイクル時にそれらのスレッドが強制終了され、アプリケーションで予期しない動作が発生します。詳細については、IIS でスレッドを使用して長時間実行されるジョブを実行できますか? の投稿を参照してください。

これは、進行状況を追跡するために、より永続的な手段を使用する必要があることを意味します。おそらくデータベースが最適ですが、プールがリサイクルされた後もファイルは存続します。


AJAX は、バックグラウンドで非同期にデータベースから進行状況を取得し、Web ページを更新できるため、これに最適です。これを実現する方法の簡単な例を次に示します。パーセンテージの計算はすべてサーバー側で行われます。

function getProgress() {
    $.ajax({
        url: '/progress',           // send HTTP-GET to /progress page
        dataType: 'json',           // return format will be JSON
        success: function(result) { // function to run once the result is pulled
            $("#p1").html('Percentage: %' + result);
            if (result == "100")
                clearInterval(window.progressID);
        }
    });
}

function startGetProgress() {
    window.progressID = setInterval(getProgress, 10000); // update progress every 10 seconds
}

上記の例では、JQuery ajax メソッドhttp://api.jquery.com/jQuery.ajax/を使用しているため、JQuery ライブラリを参照する必要があります。

Web フォームまたは MVC を使用しているかどうかにかかわらず、Web API コントローラーを追加して ajax 要求を処理できます。何か明確にする必要がある場合はお知らせください。

于 2012-11-01T03:12:49.023 に答える