1

私は MVC3 ベースの Web アプリケーションを開発しています。これは、ある時点で外部データベースから大量のデータをキャッシュする必要があります。処理には 10 ~ 30 分ほどかかります (トラフィックによって異なります) ので、BackgroundWorker に入れます。Webページの特定のボタンをクリックすると、ajaxを使用してコントローラーの他のメソッドにアクセスし、戻り値に応じて適切な情報がユーザーインターフェイスに表示されます。

コントローラ:

if (IsDbLocked())
{
    return this.Json(new 
    {
        success = false,
        message = "There is already an update requested by other user on the way."
    });
}

this.model.DataUpdateBegin();

return this.Json(new { success = true });

モデル:

public void DataUpdateBegin()
    {
        var backgroundWorker = new BackgroundWorker
                                   {
                                       WorkerSupportsCancellation = false,
                                       WorkerReportsProgress = true
                                   };

        backgroundWorker.DoWork += this.DataUpdateWorkerDoWork;
        backgroundWorker.ProgressChanged += this.DataUpdaterWorkerProgressChanged;
        backgroundWorker.RunWorkerCompleted += this.DataUpdaterWorkerRunWorkerCompleted;

        if (this.DataUpdateLockDb(true))
        {
            backgroundWorker.RunWorkerAsync();
        }
    }

更新すると、UI がフリーズします。コントローラーのデバッグ中に、BackgroundWorker が起動し、すぐにステートメントを返し続けます (success = true) が、終了するだけで他に何も起こりません (返されたメッセージは Web ページに到達しません)。

他のブラウザ/ユーザーからページを見ることができ、すべて正常に動作しますが、この特定のスレッドは数分間ロックされています (約 5 分後にロックが解除されるため、10 ~ 30 分ではありません - タイムアウト?)

私の質問は、私が間違っていたことと、それを修正する方法です。backgroundWorker がバックグラウンドで実行され、ユーザーが自由にページ内を自由に移動できることを期待しています。また、データベースにエントリを作成し、外部アプリケーションを作成してそれを取得し、すべての作業を (実際のバックグラウンドで) 実行することは、私にとっては選択肢ではありません。

4

2 に答える 2

3

このようにバックグラウンド ワーカーを使用しないでください。はい、作業は別のスレッド内で行われますが、その Web リクエストの範囲内にとどまります。Web 要求は 30 分間有効ではありません。問題が発生する可能性のある問題が多数あります (タイムアウト、アプリケーション プールの再起動、その他の IIS の動作など)。

このタイプの長時間実行タスクがある場合は、一部のワーカー (Windows サービス、おそらくコンソール アプリケーションなど) で実行する必要があります。Web からは、それを開始する (コンソール) か、実行するように設定する (メッセージ キュー、Azure キュー) )

また、データベースを 30 分間ロックしていないことを願っています (IsDbLocked() メソッド)。トランザクションでインポートを行い、適切な分離レベル (read commited) を使用するだけで、DB は常に正常に動作し、インポートが完了するとすぐに変更が反映されます。

于 2013-08-16T14:56:59.797 に答える