Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 实体框架,等待结果_Asp.net Mvc_Ajax_Entity Framework - Fatal编程技术网

Asp.net mvc 实体框架,等待结果

Asp.net mvc 实体框架,等待结果,asp.net-mvc,ajax,entity-framework,Asp.net Mvc,Ajax,Entity Framework,我正在编写一些代码,其中最常见的情况是,查询实体框架时不会返回任何结果。这个请求是由一些jQuery代码提交的,如果我用“无结果”回答,它只会返回并再次发出相同的请求——因此,我希望在获得一些结果或经过合理的时间(例如30秒)之前不进行响应(但是,我不想将结果缓存30秒-30秒是不发送查询响应的合理时间-如果结果可用,我希望它们“立即”可用) 我试着在重新查询之间睡觉,但a)似乎不起作用(每个没有结果的请求都会等待整整30秒),b)会占用asp.net线程 那么,如何将代码转换为不占用asp.n

我正在编写一些代码,其中最常见的情况是,查询实体框架时不会返回任何结果。这个请求是由一些jQuery代码提交的,如果我用“无结果”回答,它只会返回并再次发出相同的请求——因此,我希望在获得一些结果或经过合理的时间(例如30秒)之前不进行响应(但是,我不想将结果缓存30秒-30秒是不发送查询响应的合理时间-如果结果可用,我希望它们“立即”可用)

我试着在重新查询之间睡觉,但a)似乎不起作用(每个没有结果的请求都会等待整整30秒),b)会占用asp.net线程

那么,如何将代码转换为不占用asp.net线程,并在结果可用时作出响应呢

[HttpGet]
public ActionResult LoadEventsSince(Guid lastEvent, int maxEvents)
{
    maxEvents = Math.Min(50, maxEvents);    //No more than 50
    using (var dbctxt = new DbContext())
    {
        var evt = dbctxt.Events.Find(lastEvent);
        var afterEvents = (from et in evt.Session.Events
                     where et.OccurredAt > evt.OccurredAt
                     orderby et.OccurredAt
                     select new { EventId = et.EventId, EventType = et.EventType, Control = et.Control, Value = et.Value }).Take(maxEvents);

        var cycles = 30;
        while (afterEvents.Count() == 0 && cycles-- > 0)
        {
            System.Threading.Thread.Sleep(1000);
        }
        return Json(afterEvents.ToArray(), JsonRequestBehavior.AllowGet);
    }
}
请参见>

你需要进行长时间的投票。它基本上向服务器发送一个请求,而服务器只是将其保留在队列中。它累加所有查询,并在收到一些数据后立即向每个排队请求发送响应


编辑:这也很有趣

请查看此mix 11课程:“。 在课程的最后(约40-45分钟),有一个演示适合您。
我敢肯定你会说哇..

Damian Edwards答应在他的博客上发布更多关于这项技术的信息,但我们还没有看到它。

我会使用输出缓存来实现这一点。我认为根据定义,如果你想让线程等待结果出现,那么你就要绑定一个线程。@BrokenGlass-如果结果可用,我希望它们尽快返回给调用者,也就是说,不要在缓存过期25秒之后。@Rory-有几种不同的方法可以告诉asp.net您正在异步工作-我希望能得到类似的结果(我可以宣布请求尚未完成,但不要占用太多资源)这听起来像是Comet:EF方面如何工作?我不需要不断地轮询DB吗?是的,我认为你必须定期轮询。有一种方法可以使用触发器从SQL Server发送HTTP POST请求,但它被广泛使用,而且显然不是线程安全的。是的,我也看到了这一个,这是一个非常棒的会话,非常值得一看这很好,但这意味着要离开EF/Linq,我必须仔细考虑一下(另外,目前我正在使用CE作为我的后台SQL,我认为它不支持依赖项)。不过还是要谢谢你。你不必搬走,但你必须编写一些原始的sql查询。关于CE的事情——这正是我写给达米安的,让他记住他什么时候会写那篇博文。