MVC4 + EF + System.Threading.Thread 出現的問題記錄

  項目要求是頁面監測到後臺數據庫用戶數據(Users)變化,前臺作出相應的響應和操做。html

 

1、參考不少資料,大概有幾種方式:html5

參考資料地址:http://www.cnblogs.com/hoojo/p/longPolling_comet_jquery_iframe_ajax.htmljquery

客戶端不停的向服務器發送請求以獲取最新的數據信息。ajax

輪詢:客戶端定時向服務器發送Ajax請求,服務器接到請求後立刻返回響應信息並關閉鏈接。
優勢:後端程序編寫比較容易。
缺點:請求中有大半是無用,浪費帶寬和服務器資源。
實例:適於小型應用。數據庫


長輪詢:客戶端向服務器發送Ajax請求,服務器接到請求後hold住鏈接,直到有新消息才返回響應信息並關閉鏈接,客戶端處理完響應信息後再向服務器發送新的請求。
優勢:在無消息的狀況下不會頻繁的請求,耗費資源小。
缺點:服務器hold鏈接會消耗資源,返回數據順序無保證,難於管理維護。
實例:WebQQ、Hi網頁版、Facebook IM。 後端

長鏈接:在頁面裏嵌入一個隱蔵iframe,將這個隱蔵iframe的src屬性設爲對一個長鏈接的請求或是採用xhr請求,服務器端就能源源不斷地往客戶端輸入數據。
優勢:消息即時到達,不發無用請求;管理起來也相對方便。
缺點:服務器維護一個長鏈接會增長開銷。
實例:Gmail聊天服務器


Flash Socket:在頁面中內嵌入一個使用了Socket類的 Flash 程序JavaScript經過調用此Flash程序提供的Socket接口與服務器端的Socket接口進行通訊,JavaScript在收到服務器端傳送的信息後控制頁面的顯示。
優勢:實現真正的即時通訊,而不是僞即時。
缺點:客戶端必須安裝Flash插件;非HTTP協議,沒法自動穿越防火牆。
實例:網絡互動遊戲。網絡

其博文中最後提到基於html5WebSocket通訊方式無奈樓主是新手,沒有學習過,只能根據本身的理解來寫代碼。異步

 

2、代碼學習

//login頁面  2                                 var GetWeiXinLogin = function () {
 3                                     $.ajax({
 4                                         url: "/Member/GetWeiXinLogin.html",
 5                                         data: "Sceneid=@(Sceneid)",
 6                                         type: "get",
 7                                         success: function (data) {
 8                                             var dataObj = eval("(" + data + ")");
                            if (dataObj.reg == "success") {
15
alert('登陸成功');16 } 17 } 18 }) 19 }

login頁面 代碼很簡單,就是利用ajax無限訪問後臺的方法,該方法主要檢測數據庫數據變化。

 

 1  public void GetWeiXinLogin(int Sceneid)
 2         {
 3             string reg = "{\"reg\":\"408\"}";
 4             string Sql = " SELECT *  FROM WeiXinQRCodeTemporaryLog   WHERE (Sceneid = " + Sceneid + ") "; //查詢語句
 5             for (int i = 0; i < 10; i++) //執行10次 總計20秒
 6             {
 7                 var WeiXinQRCodeTemporaryLogBySql = Entity.ExecuteStoreQuery<WeiXinQRCodeTemporaryLog>(Sql); //EF執行語句
 8                 int PUid = WeiXinQRCodeTemporaryLogBySql.FirstOrNew().Uid.GetValueOrDefault(); 
 9                 if (PUid != 0) //判斷數據變化,若是==0 則前臺獲得相應
10                 {
11                     Users BaseUsers = Entity.Users.FirstOrNew(n => n.Uid == PUid);
12                     reg = "{\"reg\":\"success\",\"UTid\":\"" + BaseUsers.UTid + "\"}";
13 
14                     #region 登錄
15                     用戶登陸程序過程,省略...19                     #endregion
20                   26                     break;
27                 }
28                 System.Threading.Thread.CurrentThread.Join(2000); //沒2秒執行一次
29             }
30             Response.Write(reg);
31             Response.End();
32         }

上面代碼就是監測數據變化的簡單程序,有高手應該看出問題了,代碼的確是能實現想要的效果,可是你會發現,網站慢得讓你奔潰!

好比咱們訪問login頁面 的同時去訪問咱們同一個網站頁面的Index.html頁面,這個時候咱們的Index.html頁面加載很是得慢,必定會等到咱們的異步加載完以後才能加載出咱們的Index頁面。

這只是我的開發過程當中遇到問題的小小記錄,勿噴哈,還請高手幫忙看看,初步估計問題就出在數據庫訪問和頁面請求上。

相關文章
相關標籤/搜索