同时请求两个ashx,为什么总是在最慢那个ashx完成时一起返回?

发布于 2022-09-07 08:38:45 字数 232 浏览 25 评论 0

ASP.NET项目,有两个类A和B均实现自IHttpHandler,A正常耗时要3秒,B耗时在毫秒级,在客户端分别用两个线程请求A和B,通过fiddler抓包观察,请求时间几乎同步,按理说AB应该互不干涉,谁先完成就返回,即B很快返回,A大概3秒后返回,但观察下来几乎都是3秒后一起返回,似乎B在等A,极少的情况下才会出现B先返回,但无论同时返回还是先后返回,A和B并不在同一线程执行(通过往响应头写线程id证实),这是为什么?如何让它们之间不等待?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凑诗 2022-09-14 08:38:45

我想我知道了,AB还同时实现了IRequiresSessionState,不实现该接口就不会阻塞。看来Session这东西对并发有影响,要慎用。

篱下浅笙歌 2022-09-14 08:38:45

asp.net 中Session实现了读写锁。
你的问题是a.aspx中实现了写锁,阻塞了b.aspx页面对session的访问。
如果想同时访问,请设置a.aspx如下
<%@ Page EnableSessionState="ReadOnly"%>,同样,b.aspx中也要这样设置,因为读锁可以阻塞写锁。
这时b.aspx可以正常访问了。
同样,如果是要自定义实现IHttpHandler,需要在实现IRequiresSessionStateIReadOnlySessionState两个标记接口。
摘自MSDN
https://social.msdn.microsoft...

诺曦 2022-09-14 08:38:45
//这应该涉及到异步
//与同步相对应,是指呼叫另一操作后,不等待其结果,继续执行之后的操作,若之后没有其他操作,当前线程将进入睡眠状态,而CPU时间将有机会切至其他线程。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace 异步调用实现方法汇总
{
    /// <summary>
    /// 异步调用方法总结:
    /// 1.BeginEnvoke EndEnvoke
    /// 当使用BeginInvoke异步调用方法时,如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕
    /// </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("主线程继续执行...");
            //当使用BeginInvoke异步调用方法时,如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕
            printDelegate.EndInvoke(result);

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

        public static void Print(string s)
        {
            Console.WriteLine("异步线程开始执行:"+s);
            Thread.Sleep(5000);
        }
    }
}

更多...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文