5

非同期デリゲートが実行を途中で終了せずに、コントローラーメソッド内から非同期メソッドを実行してHttpStatusCodeResult(200)を返すにはどうすればよいですか?

私はasp.netアプリケーションに取り組んでおり、私のアクションの1つで、ホームコントローラーの実行に長い時間がかかります(10〜30秒)。HttpStatusCodeResult(200)を返し、関数を実行し続けたい。functoinは何も返す必要はありませんが、それでも実際にはファイア・アンド・ケースではなく、サーバーに.ですぐに応答を返すので忘れてしまいますHttpStatusCodeResult

デリゲートを使用してみましたが、アクションからステータスコードを返すと、デリゲートの実行が停止するようです。もう1つのオプションは、Windowsサービスを作成することですが、これはバズーカを使用してハエを殺すようなものです。リクエストが非常に少ないので、私の場合、リソースとパフォーマンスは問題になりません。オプションだと聞きましたThreadPool.QueueUserWorkItemが、私の場合はどちらが最適ですか?

4

1 に答える 1

1

この長時間実行される操作を管理する静的クラスを作成します。このクラスは、タスクを実行するためのスレッドの作成を担当し、進行中の操作のステータスをチェックする方法も提供します(つまり、進行中または終了した場合、結果はどうなりますか)。

次に、MVC Controllerメソッドはこのクラスを使用して作業を行い、ステータス情報または完了した処理済みデータをユーザーに提示します。

このようなもの:

public ActionResult GetSomething(String id) {
    TaskResult result = TaskClass.GetStatus( id );
    if( result == null ) { // the task has not been run, so start it up
        TaskClass.StartNew( id );
        return new View("PleaseWait");
    } else if( !result.IsFinished ) {
        return new View("PleaseWait");
    } else {
        return View("Results", result);
    }
}

public static class TaskClass {
     private static Dictionary<String,TaskResult> _tasks;
     public static TaskResult GetStatus(String id) {
         // TODO: Make this code thread-safe
         if( _tasks.ContainsKey(id) ) return _tasks[id];
         return null;
     }
     public static void Start(String id) {
         _tasks.Add( id, new TaskResult("Working") );
         Thread thread = new Thread( SomeExpensiveOperation );
         thread.Start( id );
     }
}

SomeExpensiveOperationの最後に、TaskResultを終了としてマークするコードがあります。

于 2012-07-15T18:47:06.720 に答える