2012-02-24 10 views
0

ここに私のコードスレッド同期は

public ActionResult Index() 
    { 
     ViewBag.Message = "Welcome to ASP.NET MVC!"; 
     Thread t1 = new Thread(DoLengthyOperation); 
     t1.Start(); 
     return View(); 
    } 

    public ActionResult About() 
    { 
     //Check if thread t1 is completed or not, if not keep waiting. 
     return View(); 
    } 
    public void DoLengthyOperation() 
    { 
     Thread.Sleep(10000); 
    } 

私は何をしたいことです
1)
を待っているポイントがないので、そのプロセスは何も返さないよう、ホームアクションで長いプロセスを開始します 2)私の "About"アクションで、プロセスが "Home"アクションを終了したかどうかをチェックしたい場合は、終了してから終了します。
私は静的インスタンスを試しましたが、それは同時に要求に役立ちません
私もグローバル変数を試してみましたが、すべての要求がコントローラの新しいコピーを取得するので役立たなかった。
私の究極の目標は、ユーザーがインデックスページを見ているときです。私の長いプロセスはバックグラウンドで終了するはずです。プロセスは20秒かかります。
すべてのヘルプは
おかげ

答えて

0

タスクを使用して、あなたのセッション状態ディクショナリに格納し、高く評価されるだろう。

public ActionResult Index() 
{ 
    ViewBag.Message = "Welcome to ASP.NET MVC!"; 
    var longRunningTask = Task.Factory.StartNew(DoLengthyOperation); 
    Session["MyApp_SessionTask"] = longRunningTask; 
    return View(); 
} 


public ActionResult About() 
{ 
    // Note that the below Wait method has a bunch of overloads you can use 
    // i.e. only wait up until a fixed timeout, wait until a separate cancellation 
    // token is signaled, etc. 
    var longRunningTask = (Task) Session["MyApp_SessionTask"]; 
    if (longRunningTask != null) 
     longRunningTask.Wait(); 
    return View(); 
} 

処理中のセッション状態を使用しない場合、これは機能しません。

+0

ありがとう@Tyson、タスクはセッションごとです。何がlongRunningTask変数のスコープになりますか? – Nnp

+0

セッション状態でそれを保存します。上記の編集を参照してください。感謝@tyson – Tyson

+0

。私は今TempDataに格納しています。 – Nnp