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

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

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

回答
編輯回答
祈歡

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

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

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

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

namespace 異步調用實現方法匯總
{
    /// <summary>
    /// 異步調用方法總結:
    /// 1.BeginEnvoke EndEnvoke
    /// 當使用BeginInvoke異步調用方法時,如果方法未執(zhí)行完,EndInvoke方法就會一直阻塞,直到被調用的方法執(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í)行...");
            //當使用BeginInvoke異步調用方法時,如果方法未執(zhí)行完,EndInvoke方法就會一直阻塞,直到被調用的方法執(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