2013-10-12 33 views
9

我使用的是asp.net mvc,并且当他到达网站的主页时,我想从数据库缓存一些关于用户的数据。 因此,当用户请求主页时,我想调用一个异步方法,这会使数据库调用和缓存数据。无需等待即可开始任务

这样做的任何例子都会很棒。

+1

你有没有尝试过任何东西? – SpringLearner

回答

0
ThreadPool.QueueUserWorkItem((Action<object>)state => 
{ 
    //do your async work 
}, null); 

Task.StartNew(...)

(遗憾的简短回答,这可能需要你在正确的轨道上或有人可以编辑这个展示一个完整的例子吗?)

+0

你能帮我缓存一边吗?可以说我需要2秒钟的时间来使用我的Task.StartNew(...)缓存数据。如果用户恰好在2秒之前访问这些数据,我将如何让线程等待,直到从数据库读取完整数据并缓存为止。 – user2873833

+0

在这种情况下,您可以将任务保存在静态列表/字典中,并检查任务是否已经可用。在这种情况下,调用task.Wait,然后检索Task.Result或访问缓存对象。 (顺便说一下,不要错过HttpUtility.Cache) – eFloh

15
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
    ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

    Task.Run(()=> DoSomeAsyncStuff()); 

    return View(); 
    } 

    private async void DoSomeAsyncStuff() 
    { 

    } 
} 
+0

当DoSomeAsyncStuff()本身挂起时,这对我有用。我试图按照[在这里]描述的那样工作(http://farazdagi.com/blog/2014/rest-long-running-jobs/)。 – OutstandingBill

1

我会说你通过这种方式调用缓存方法:

HostingEnvironment.QueueBackgroundWorkItem(x=> CacheData()); 

这样,你就不会确保主页请求等待,以便用户立即看到主页,而缓存则发生在服务器的后台。

PS:但是,您运行应用程序域回收的风险很小,无法使用缓存线程。