如果您覺(jué)得前面的文字可能不是太好理解,沒(méi)關(guān)系,我特意做了幾個(gè)實(shí)驗(yàn)頁(yè)面,請(qǐng)繼續(xù)往下看。
第一個(gè)頁(yè)面,主要HTML部分:
This is Default1.aspx
第一個(gè)頁(yè)面,后臺(tái)代碼部分:
protected void Page_Load(object sender, EventArgs e)
{
// 這里故意停5秒。
System.Threading.Thread.Sleep(5000);
}
第二個(gè)頁(yè)面,主要HTML部分(無(wú)后臺(tái)代碼):
This is Default3.aspx
第三個(gè)頁(yè)面,主要HTML部分(無(wú)后臺(tái)代碼):
This is Default3.aspx
現(xiàn)在輪到主框架頁(yè)面上場(chǎng)了,主要HTML部分
主框架頁(yè)面,后臺(tái)代碼部分:
public partial class _Default : System.Web.UI.Page
{
private static int count = 0;
protectedvoidPage_Load(objectsender, EventArgs e){// 因?yàn)榍懊娴捻?yè)面都沒(méi)有使用Session,所以就在這里簡(jiǎn)單地使用一下了。Session["Key1"] = System.Threading.Interlocked.Increment(refcount);}protectedoverridevoidOnPreRender(EventArgs e){base.OnPreRender(e);this.labResult.Text = Session["Key1"].ToString();}
}
以上代碼實(shí)在太簡(jiǎn)單,我也不多說(shuō)了?,F(xiàn)在來(lái)看一下頁(yè)面顯示效果吧。首先看到的是這個(gè)樣子:
ASP.NET:Session對(duì)并發(fā)訪問(wèn)的影響
5秒后,所有子框架的頁(yè)面才會(huì)全部加載完成。
上面的示例代碼寫(xiě)得很清楚,只有default1.aspx才會(huì)執(zhí)行5秒,后面2個(gè)頁(yè)面沒(méi)有任何延遲,應(yīng)該會(huì)直接顯示的。但從結(jié)果可以看出:第一個(gè)頁(yè)面請(qǐng)求阻塞了后面的所有頁(yè)面請(qǐng)求!!
其實(shí)同樣的場(chǎng)景還會(huì)發(fā)生在Ajax比較密集的網(wǎng)站中,這類(lèi)網(wǎng)站中,一個(gè)頁(yè)面也有可能發(fā)出多個(gè)請(qǐng)求,而且是在【上一個(gè)請(qǐng)求還沒(méi)完成前】就發(fā)出了下一個(gè)請(qǐng)求,此時(shí)的請(qǐng)求過(guò)程其實(shí)與上面的子框架是一樣的。有人可能想問(wèn):我的網(wǎng)站就沒(méi)關(guān)Session,Ajax的使用也很多,為什么就沒(méi)有這種感覺(jué)呢?其實(shí),前面也說(shuō)了:這里的并發(fā)影響只限于同一個(gè)用戶的多次請(qǐng)求,而且如果服務(wù)器響應(yīng)比較快時(shí),我們通常也是不能察覺(jué)的,但它卻實(shí)也是會(huì)阻塞后面的請(qǐng)求。
我們感覺(jué)不到Session的阻塞,是因?yàn)樽枞臅r(shí)間不夠長(zhǎng),而我的測(cè)試用例故意則讓這種現(xiàn)象更明顯了。 不管你們信不信,反正我是信了。
對(duì)于并發(fā)問(wèn)題,我想談?wù)勎业南敕ǎ何④浽赟ession中,使用了鎖定的設(shè)計(jì),雖然會(huì)影響并發(fā),但是,設(shè)計(jì)本身是安全的、周密的。因?yàn)榇_實(shí)有可能存在一個(gè)用戶的多個(gè)請(qǐng)求中會(huì)有修改與讀取的沖突操作。微軟是做平臺(tái)的,他們不得不考慮這個(gè)問(wèn)題。但現(xiàn)實(shí)中,這種沖突的可能性應(yīng)該是很小的,或者是我們能控制的,在此情況下,會(huì)顯得這個(gè)問(wèn)題是不可接受的。
文章來(lái)源:搜索引擎大全http://www.iis7.com/b/ssyqdq/