在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/C#  Linux  網(wǎng)絡(luò)安全  HTML/ 同時(shí)請(qǐng)求兩個(gè)ashx,為什么總是在最慢那個(gè)ashx完成時(shí)一起返回?

同時(shí)請(qǐng)求兩個(gè)ashx,為什么總是在最慢那個(gè)ashx完成時(shí)一起返回?

ASP.NET項(xiàng)目,有兩個(gè)類A和B均實(shí)現(xiàn)自IHttpHandler,A正常耗時(shí)要3秒,B耗時(shí)在毫秒級(jí),在客戶端分別用兩個(gè)線程請(qǐng)求A和B,通過(guò)fiddler抓包觀察,請(qǐng)求時(shí)間幾乎同步,按理說(shuō)AB應(yīng)該互不干涉,誰(shuí)先完成就返回,即B很快返回,A大概3秒后返回,但觀察下來(lái)幾乎都是3秒后一起返回,似乎B在等A,極少的情況下才會(huì)出現(xiàn)B先返回,但無(wú)論同時(shí)返回還是先后返回,A和B并不在同一線程執(zhí)行(通過(guò)往響應(yīng)頭寫(xiě)線程id證實(shí)),這是為什么?如何讓它們之間不等待?

回答
編輯回答
祈歡

asp.net 中Session實(shí)現(xiàn)了讀寫(xiě)鎖。
你的問(wèn)題是a.aspx中實(shí)現(xiàn)了寫(xiě)鎖,阻塞了b.aspx頁(yè)面對(duì)session的訪問(wèn)。
如果想同時(shí)訪問(wèn),請(qǐng)?jiān)O(shè)置a.aspx如下
<%@ Page EnableSessionState="ReadOnly"%>,同樣,b.aspx中也要這樣設(shè)置,因?yàn)樽x鎖可以阻塞寫(xiě)鎖。
這時(shí)b.aspx可以正常訪問(wèn)了。
同樣,如果是要自定義實(shí)現(xiàn)IHttpHandler,需要在實(shí)現(xiàn)IRequiresSessionStateIReadOnlySessionState兩個(gè)標(biāo)記接口。
摘自MSDN
https://social.msdn.microsoft...

2017年3月22日 07:05
編輯回答
孤影

我想我知道了,AB還同時(shí)實(shí)現(xiàn)了IRequiresSessionState,不實(shí)現(xiàn)該接口就不會(huì)阻塞。看來(lái)Session這東西對(duì)并發(fā)有影響,要慎用。

2017年10月27日 12:04
編輯回答
萌二代
//這應(yīng)該涉及到異步
//與同步相對(duì)應(yīng),是指呼叫另一操作后,不等待其結(jié)果,繼續(xù)執(zhí)行之后的操作,若之后沒(méi)有其他操作,當(dāng)前線程將進(jìn)入睡眠狀態(tài),而CPU時(shí)間將有機(jī)會(huì)切至其他線程。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace 異步調(diào)用實(shí)現(xiàn)方法匯總
{
    /// <summary>
    /// 異步調(diào)用方法總結(jié):
    /// 1.BeginEnvoke EndEnvoke
    /// 當(dāng)使用BeginInvoke異步調(diào)用方法時(shí),如果方法未執(zhí)行完,EndInvoke方法就會(huì)一直阻塞,直到被調(diào)用的方法執(zhí)行完畢
    /// </summary>
    class Program
    {
        public delegate void PrintDelegate(string s);
        static void Main(string[] args)
        {
            PrintDelegate printDelegate = Print;
            Console.WriteLine("主線程");

            IAsyncResult result= printDelegate.BeginInvoke("Hello World.", null, null);
            Console.WriteLine("主線程繼續(xù)執(zhí)行...");
            //當(dāng)使用BeginInvoke異步調(diào)用方法時(shí),如果方法未執(zhí)行完,EndInvoke方法就會(huì)一直阻塞,直到被調(diào)用的方法執(zhí)行完畢
            printDelegate.EndInvoke(result);

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey(true);
        }

        public static void Print(string s)
        {
            Console.WriteLine("異步線程開(kāi)始執(zhí)行:"+s);
            Thread.Sleep(5000);
        }
    }
}

更多...

2017年3月21日 17:48