葡萄需要什么土壤(葡萄需要的土壤)
2024-07-02
更新時(shí)間:2024-07-02 09:03:08作者:未知
最近在寫Webform頁面程序發(fā)現(xiàn)這樣一個(gè)現(xiàn)象:在做導(dǎo)出功能時(shí),由于導(dǎo)出數(shù)據(jù)的處理時(shí)間比較長,就在客戶端加一個(gè)定時(shí)器通過ajax不間斷查詢導(dǎo)出進(jìn)度。然后發(fā)現(xiàn)了一個(gè)情況,這個(gè)請求一直是阻塞的狀態(tài),直到導(dǎo)出事件處理完成之后。才去執(zhí)行這個(gè)請求,也就是說如果響應(yīng)時(shí)間長的請求還在進(jìn)行中,短的請求卻被掛起了。
百度了下,最終確定是Asp.Net Session造成的。原文:https://www.cnblogs.com/littlewrong/p/4783104.html
原理:Session實(shí)現(xiàn)了Reader/Writer的鎖機(jī)制:
當(dāng)頁面對Session具有可寫功能(即頁面有<%@Page EnableSessionState=”True” %>標(biāo)記),此時(shí)直到請求完成該頁面的Session持有一個(gè)寫鎖定。
當(dāng)頁面對Session具有只讀功能(即頁面有<%@Page EnableSessionState=”ReadOnly” %>標(biāo)記),此時(shí)知道請求完成該頁面的Session持有一個(gè)讀鎖定。
讀鎖定將阻塞一個(gè)寫鎖定;讀鎖定不會阻塞讀鎖定;寫鎖定將阻塞所有的讀寫鎖定。這就是為什么兩個(gè)框架中的同一個(gè)頁面都去寫同一個(gè)Session時(shí),其中一個(gè)要等待另一個(gè)(稍快的那個(gè))完成后,才開始寫。
“寫鎖定將阻塞所有的讀寫鎖定”,也就是說頁面在EnableSessionState=”True”的情況下沒返回輸出時(shí),一直持著Session寫操作,其他頁面對Session的讀操作必須等待,而asp.net的aspx頁面默認(rèn)是EnableSessionState=”True”,每個(gè)頁面從請求開始至返回一直持著Session寫操作,需驗(yàn)證頁面必須讀取Session值判斷,這就是為什么需驗(yàn)證的頁面請求被阻塞的原因。只要耗時(shí)頁面(A頁面)沒有Session的寫操作,也就不會阻塞其他頁面的請求,于是修改A頁面的EnableSessionState=”ReadOnly”,例如:<%@ Page Language=”C#” AutoEventWireup=”true”CodeFile=”TBS_Monitor_List.aspx.cs”EnableSessionState=”ReadOnly” Inherits=”TBS_Monitor_List” %> ,問題解決。
結(jié)論:也就是說,在無需對session進(jìn)行寫操作的頁面,在Page指令加上EnableSessionState=”ReadOnly”屬性,就不會造成Request阻塞的情況了。