2011-04-29 89 views
3

我正在寫一些代碼,其中最常見的是沒有結果將從查詢返回對實體框架。這個請求是由一些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); 
    } 
} 
+2

我只想用輸出緩存此 – BrokenGlass 2011-04-29 15:57:50

+0

我認爲按照定義,如果你想讓線程等待,直到有結果,那麼你將綁定一個線程。 – Rory 2011-04-29 16:00:56

+0

@BrokenGlass - 如果結果*可用,我希望它們儘快返回給調用者,即不會在緩存過期25秒後返回。 – 2011-04-29 16:02:03

回答

4

退房這樣的搭配11屆: 「Pragmatic JavaScript jQuery & AJAX with ASP.NET」。 在最後(約40-45分鐘)會有演示權。
我prety相信你一定會說,哇..
達米安·愛德華茲promissed發佈更多關於他的博客的技術,但我們還沒有看到它..

+0

是的,我也看到了這一個,這是一個很棒的會議,非常值得關注 – BrokenGlass 2011-04-29 21:46:33

+0

剛剛看過。這很好,但它意味着遠離EF/Linq,我必須仔細考慮它(此刻,我使用CE作爲我的支持SQL,並且我認爲它不支持依賴關係) 。不過謝謝。 – 2011-04-30 09:25:10

+0

好吧,你不必離開,但你必須寫一些原始的SQL查詢。關於行政長官的事情 - 這正是我寫給達米安需要記住的時候,他會寫這篇博文。 – 2011-04-30 16:40:24

0

查看>Reverse ajax Comet/Polling implementation for ASP.NET MVC?

你需要長時間輪詢。它基本上向服務器發送一個請求,服務器只是將它保留在隊列中。它累積所有的查詢,並且一旦它收到一些數據,就會將響應發送給每個排隊的請求。

編輯:另外這個很有意思>Comet implementation for ASP.NET?

+0

這項工作的EF方面將如何 - 我不需要不斷地調查數據庫? – 2011-04-29 16:17:02

+0

是的,我認爲你必須定期輪詢。有一種使用Triggers從SQL Server發送HTTP POST請求的方法,但它被廣泛使用,顯然不是線程安全的。 – neebz 2011-04-29 16:21:16