中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

基(ji)礎才是重(zhong)中之重(zhong)~開發人(ren)員(yuan)你應(ying)該認(ren)識(shi)一(yi)下Web主線程

知(zhi)(zhi)方可(ke)(ke)補不(bu)足,不(bu)知(zhi)(zhi)永遠為不(bu)知(zhi)(zhi)!我(wo)很喜歡這句(ju)格言,說的(de)不(bu)錯,我(wo)們(men)在人(ren)生(sheng)的(de)旅途中(zhong),永遠不(bu)可(ke)(ke)能對(dui)所有知(zhi)(zhi)識了(le)如指掌,但我(wo)們(men)可(ke)(ke)以做到盡(jin)量多知(zhi)(zhi)道些,當(dang)你(ni)知(zhi)(zhi)道它了(le),它將會(hui)成為你(ni)的(de)知(zhi)(zhi)道領(ling)域,從(cong)而縮(suo)小了(le)你(ni)的(de)不(bu)知(zhi)(zhi)道領(ling)域的(de)范圍.

今天(tian)主(zhu)要說(shuo)(shuo)一下Web主(zhu)線程的(de)問題,這個東西你在網上可能(neng)找不(bu)到(dao)什么結果,你搜索它,可能(neng)也搜不(bu)到(dao)相關(guan)知(zhi)識(shi),不(bu)知(zhi)道為何沒(mei)什么有去說(shuo)(shuo)它,雖然沒(mei)人說(shuo)(shuo),但我還(huan)是要說(shuo)(shuo)說(shuo)(shuo),因(yin)為我覺得(de),開(kai)發人員了(le)解一些這方面(mian)的(de)知(zhi)識(shi)還(huan)是很有必要的(de).

當(dang)然(ran)網站被用戶(hu)(hu)加(jia)載后(hou),可能你會打開(kai)/product/index這種頁(ye)(ye)面(mian),它將會在服務器端產生一(yi)(yi)個(ge)(ge)線程(cheng)(cheng)(cheng),這個(ge)(ge)線程(cheng)(cheng)(cheng)我們稱(cheng)為主(zhu)線程(cheng)(cheng)(cheng),當(dang)然(ran)你的(de)(de)程(cheng)(cheng)(cheng)序中也可以通過(guo)Thread類(lei)建立其(qi)它線程(cheng)(cheng)(cheng),但只要你加(jia)開(kai)頁(ye)(ye)面(mian),就會有(you)一(yi)(yi)個(ge)(ge)主(zhu)線程(cheng)(cheng)(cheng)被加(jia)載,這是一(yi)(yi)定(ding)的(de)(de),我們可以通過(guo)Thread.CurrentThread靜態屬性來獲得當(dang)前運行著(zhu)的(de)(de)線程(cheng)(cheng)(cheng),對于每個(ge)(ge)客戶(hu)(hu)端來說,它都是唯(wei)一(yi)(yi)的(de)(de),但不同的(de)(de)客戶(hu)(hu)端,它是不同的(de)(de),例如:

客(ke)戶端A訪問/product/index頁面(mian),它(ta)所得到Thread.CurrentThread.ManagedThreadId可能是(shi)(shi)(shi)8,而客(ke)戶端B訪問這個頁面(mian)時,它(ta)的值可能是(shi)(shi)(shi)12,這是(shi)(shi)(shi)我(wo)們(men)要注意的地(di)方.

當然,如(ru)果A所(suo)在(zai)的線程(cheng)8被系(xi)統回收了,那B有(you)可能(neng)會(hui)(hui)被分配到(dao)這(zhe)個8號線程(cheng),所(suo)以,大家在(zai)使用(yong)線程(cheng)時,需要(yao)考慮(lv)這(zhe)種情況幼,它可能(neng)會(hui)(hui)隱藏(zang)一些潛在(zai)的問題!

我(wo)們(men)一般可以通過下面代碼去測(ce)試你(ni)的(de)當(dang)前(qian)線(xian)程:

        public ActionResult About1()
        {
            ViewData["msg"] = "當前線程:" + Thread.CurrentThread.ManagedThreadId.ToString();
            return View();
        }

對于(yu)一個頁面,也可以通過創建多線程的方(fang)式,來(lai)模擬多個客戶端,代碼如下(xia):

            for (int i = 0; i < 10; i++)
            {
                var t = new Thread(() =>
                {
                    ViewData["msg"] = ViewData["msg"] + DbFactory.Intance();
                });
                t.Start();
         Thread.Sleep(1000); }
    /// <summary>
    /// 線(xian)程單例對象(xiang)工廠(chang)
    /// </summary>
    internal static class DbFactory
    {
        volatile static Dictionary<Thread, string> divDataContext;
        static System.Timers.Timer sysTimer;
        static DbFactory()
        {
            divDataContext = new Dictionary<Thread, string>();
            sysTimer = new System.Timers.Timer(10000);
            sysTimer.AutoReset = true;
            sysTimer.Enabled = true;
            sysTimer.Elapsed += new System.Timers.ElapsedEventHandler(sysTimer_Elapsed);
            sysTimer.Start();
        }

        /// <summary>
        /// 清(qing)理上下文(wen)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void sysTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            List<Thread> list = divDataContext
                .Keys
                .Where(item => item.ThreadState == ThreadState.Stopped)
                .ToList();
            if (list != null && list.Count > 0)
            {
                foreach (var i in list)
                {
                    divDataContext[i] = null;
                    divDataContext.Remove(i);
                }
            }
        }
        /// <summary>
        /// 生成對象
        /// </summary>
        /// <returns></returns>
        public static string Intance()
        {

            if (!divDataContext.Keys.Contains(Thread.CurrentThread))
            {
                divDataContext.Add(Thread.CurrentThread, "當(dang)前線程名稱:"
                       + Thread.CurrentThread.ManagedThreadId.ToString().PadLeft(2, '0')
                       + ",線(xian)程總數:"
                       + divDataContext.Count
                       + ",已(yi)經結束的總數(shu):"
                       + divDataContext.Keys.Where(item => item.ThreadState == ThreadState.Stopped).Count()
                       + "<hr>");
            }

            return divDataContext[Thread.CurrentThread];
        }
    }

 

上(shang)面代(dai)碼將會(hui)(hui)產生10個(ge)新線(xian)程(cheng),他們在執(zhi)行完后(hou),可以讓(rang)系統等待1秒鐘后(hou),再執(zhi)行下一個(ge)線(xian)程(cheng),上(shang)面的線(xian)程(cheng)為異步的,當線(xian)程(cheng)start()后(hou),主(zhu)程(cheng)序(xu)會(hui)(hui)繼續執(zhi)行

它不會等待子線程,而如果你不想讓主程序馬上執行,你可以加個Sleep(t),這時,反映到頁面上,就會出現(xian)延時的情況.

 

posted @ 2013-04-08 13:45  張占嶺  閱讀(1631)  評論(0)    收藏  舉報