【发布时间】: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