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

同時請求兩個ashx,為什么總是在最慢那個ashx完成時一起返回?

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

回答
編輯回答
祈歡

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

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

我想我知道了,AB還同時實現(xiàn)了IRequiresSessionState,不實現(xiàn)該接口就不會阻塞??磥鞸ession這東西對并發(fā)有影響,要慎用。

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

namespace 異步調(diào)用實現(xiàn)方法匯總
{
    /// <summary>
    /// 異步調(diào)用方法總結(jié):
    /// 1.BeginEnvoke EndEnvoke
    /// 當(dāng)使用BeginInvoke異步調(diào)用方法時,如果方法未執(zhí)行完,EndInvoke方法就會一直阻塞,直到被調(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)用方法時,如果方法未執(zhí)行完,EndInvoke方法就會一直阻塞,直到被調(diào)用的方法執(zhí)行完畢
            printDelegate.EndInvoke(result);

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

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

更多...

2017年3月21日 17:48