2012-02-24 157 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)在我的“关于”操作中,我想检查进程是否开始“主页”操作已完成或没有完成,如果没有,则等待直至完成。
我已经尝试过静态实例,但这不会对同时请求有帮助,
我也尝试过全局变量,但没有帮助,因为每个请求都获得控制器的新副本。
我的最终目标是当用户在查看索引页时,我的漫长过程应该在后台完成,我的过程需要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

谢谢@泰森,任务是每届会议..什么将范围longRunningTask变量? – Nnp 2012-02-24 00:31:29

+0

然后将其存储在会话状态。见上面的编辑。 – Tyson 2012-02-24 00:41:20

+0

谢谢@tyson。我现在在TempData存储,它的工作原理。 – Nnp 2012-02-24 19:14:14