【问题标题】:entity framework, wait for results实体框架,等待结果
【发布时间】:2011-08-15 14:45:37
【问题描述】:

我正在编写一些代码,最常见的是,针对 Entity Framework 的查询不会返回任何结果。此请求已由一些 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);
    }
}

【问题讨论】:

  • 我会为此使用输出缓存
  • 我认为根据定义,如果您希望线程等到有结果,那么您将占用一个线程。
  • @BrokenGlass - 如果结果 可用,我希望它们尽快返回给调用者,即不是在缓存过期 25 秒后。
  • @Rory - 有几种不同的方式可以告诉 asp.net 你正在异步工作 - 我希望有一些类似的东西(我可以宣布请求还没有完成,但不会占用太多资源)

标签: asp.net-mvc ajax entity-framework


【解决方案1】:

请参阅 > Reverse ajax Comet/Polling implementation for ASP.NET MVC?

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

编辑:这也很有趣>Comet implementation for ASP.NET?

【讨论】:

  • EF 方面如何工作 - 我不需要不断轮询数据库吗?
  • 是的,我认为您必须定期轮询。有一种使用触发器从 SQL Server 发送 HTTP POST 请求的方法,但它被广泛使用并且显然不是线程安全的。
【解决方案2】:

查看此 mix 11 会话:“Pragmatic JavaScript jQuery & AJAX with ASP.NET”。 在它的最后(大约 40-45 分钟进入会议)有一个适合你的演示。
我很确定你会说哇..
Damian Edwards 承诺会在他的博客上发布更多关于这项技术的信息,但我们还没有看到它......

【讨论】:

  • 是的,我也看过这个,非常棒,非常值得一看
  • 刚刚看过。很好,但这意味着离开 EF/Linq,我将不得不仔细考虑(另外,目前,我使用 CE 作为我的支持 SQL,我认为它不支持依赖项) .不过还是谢谢。
  • 好吧,您不必搬走,但您必须编写一些原始的 sql 查询。关于 CE 的事情——这正是我写给 Damian 的内容,以记住他何时写那篇博文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2019-11-10
  • 1970-01-01
相关资源
最近更新 更多