asp.net 中的后台工作者(线程池)

2024-02-22

我有一个 ASP.NET Web 表单,它将大约 25-30 个项目(包含用户从表单发出后续请求时所需的信息)写入自定义缓存中。目前,所有这些都是在主线程上同步发生的。但在较高负载下,addcache 正在成为瓶颈。

如何在后台运行此任务而不消耗 asp.net 工作进程线程池中的线程。


备择方案:

完全异步:

  • 客户端使用AJAX调用服务端代码,并添加代码来监控调用的过程

    我刚刚添加了与此过程相关的答案:

    https://stackoverflow.com/a/11524718/1268570 https://stackoverflow.com/a/11524718/1268570

部分异步:

从客户端到服务器的调用将是同步的,这意味着在整个过程结束之前响应不会返回到客户端,但真正的代码将异步执行,释放 ASP.Net 使用的线程,从而提高可扩展性

  • 执行页面异步。您需要实施IHttpAsyncHandler接口位于 ASPX 代码后面。这是一个例子:

        public partial class _Default : System.Web.UI.Page, IHttpAsyncHandler
        {
            public void EndProcessRequest(IAsyncResult result)
            {
                var context = (result as AsyncOperation).Context;
    
                context.Response.Write(string.Format("<p>End Process Request on {0}</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
            }
    
            public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
            {
                var operation = new AsyncOperation(cb, this.Context, extraData);
                operation.StartAsync();
    
                this.Context.Response.Write(string.Format("<p>Begin Process Request on: {0}...</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
    
                return operation;
            }
        }
    
        public class AsyncOperation : IAsyncResult
        {
            private AsyncCallback asyncCallback;
    
            public AsyncOperation(AsyncCallback asyncCallback, HttpContext context, object state)
            {
                this.AsyncState = state;
                this.asyncCallback = asyncCallback;
                this.Context = context;
    
                this.IsCompleted = false;
                this.AsyncWaitHandle = null;
                this.CompletedSynchronously = false;
            }
    
            public HttpContext Context { get; private set; }
            public object AsyncState { get; private set; }
            public WaitHandle AsyncWaitHandle { get; private set; }
            public bool CompletedSynchronously { get; private set; }
            public bool IsCompleted { get; private set; }
    
            public void StartAsync()
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncOperation), this.AsyncState);
            }
    
            public void StartAsyncOperation(object workItemState)
            {
                // place here the async logic
    
                this.Context.Response.Write(string.Format("<p>Long Async operation started on: {0}</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
                Thread.Sleep(2000);
                this.Context.Response.Write(string.Format("<p>Long Async operation ended on: {0}</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
                this.IsCompleted = true;
                this.asyncCallback(this);
            }
        }
    

    Output

  • 创建一个 HttpAsyncHandler。您需要创建一个自定义HttpHandler实施IHttpAsyncHandler界面。例子:

    public class AsyncHandler : IHttpAsyncHandler
    {
        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
            var operation = new AsyncOperation(cb, context, extraData);
            operation.StartAsync();
    
            context.Response.Write(string.Format("<p>Begin Process Request on: {0}...</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
    
            return operation;
        }
    
        public void EndProcessRequest(IAsyncResult result)
        {
            var context = (result as AsyncOperation).Context;
    
            context.Response.Write(string.Format("<p>End Process Request on {0}</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
        }
    
        public bool IsReusable
        {
            get { return false; }
        }
    
        public void ProcessRequest(HttpContext context)
        {
            throw new NotImplementedException();
        }
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

asp.net 中的后台工作者(线程池) 的相关文章

随机推荐

  • facebook connect - 获取高分辨率/原始分辨率的个人资料照片

    有没有办法以比 大 200x0 更高分辨率的方式获取用户的个人资料照片 https graph facebook com 19292868552 picture type large https graph facebook com 192
  • jquery .click 覆盖锚点 href 当我不想要它时!

    我有一组嵌套的 DIV 当用户单击它们时 它们使用 jQuery 进行滑动切换 在最里面的 DIV 内有一个带有 HREF 的锚标记 可以导航到某个位置 问题是 当我单击链接时 它会像父 DIV 一样滑动切换 而不是导航到 url 如果我右
  • 如何找到矩阵元胞数组中每个维度的最大值?

    我得到一个元胞数组A由不同大小的矩阵组成 例如 我可以有一个三元素元胞数组 其中每个元素的维度为 A 1 gt 4 x 3 A 2 gt 16 x 4 A 3 gt 5 x 14 我将如何遍历元胞数组并返回最大值每个维度全面的 例如 示例中
  • 在自定义列表视图中一次仅选择一个单选按钮,android

    我正在尝试制作自定义列表视图 列表视图中的每个条目都有一个图像视图 一个文本视图和一个单选按钮 我终于列出了列表 但现在我在选择单选按钮时遇到了问题 我想要的是每当用户单击条目中的任意位置时 这应该设置相应的单选按钮并自动取消选择列表中的其
  • 创建后更改 google-analytics TrackingId

    描述 我有一个使用 googleanalytics 代码的单页应用程序 该应用程序适用于 4 个不同国家的顶级域名 例如www example de www example at www example be 等 也可以在不更改域名的情况下
  • 等待循环点击

    在开始之前 我知道已经有一个thread https stackoverflow com questions 19509296 wait for a user event关于这一点 但不幸的是它对我没有任何帮助 所以这是我的问题 我有一个用
  • 如何从 Laravel 项目中公共图像的 URL 中删除 /storage?

    我想要实现的目标是从 URL 中删除 storage 以便最终它是www example com images x jpg而不是默认的www example com storage x jpg 我尝试从 storage 中删除url in
  • IE中Excel导出问题

    我有这个脚本可以将mysql数据导出到excel 我努力了 一切 但我无法让这个脚本适用于 IE 这 脚本使用 FireFox 或 Chrome 下载数据 但 IE 失败并且 说 Internet Explorer 无法从 www mysi
  • 堆栈跟踪中的神秘行

    While 调查堆栈跟踪差异 https stackoverflow com questions 42462750 why java enum need to check class and declaringclass in compar
  • 设置 google.visualization.DataTable 的列宽

    我想更改 google visualization DataTable 中列的宽度 但是我不知道该怎么做 Fiddler https jsfiddle net dgbh6sL0 1 https jsfiddle net dgbh6sL0 1
  • viewDidLoad 在启动时在 rootViewController 上被调用两次

    有谁知道为什么这个根View Controller s viewDidLoad启动时被调用两次 这让我发疯 这是从第一次到的堆栈跟踪viewDidLoad 0 0x0000276a in RootViewController viewDid
  • JavaScript 中的鼠标光标位置?

    如何在javascript中获取光标X和Y var curX ns6 e pageX event clientX ietruebody scrollLeft var curY ns6 e pageY event clientY ietrue
  • 从字典的字典创建内部值的列表

    我试图找出字典内部值的最大值和最小值dicts The dict看起来像这样 ALLEN PHILLIP K bonus 4175000 exercised stock options 1729541 expenses 13868 BADU
  • 为什么 MongoDb 文档 id 前面有一个下划线?

    为什么 MongoDb 文档 id 前面有一个下划线 为什么不称其为 id 而不是 id 这是我不知道的命名约定的一部分吗 您可能会注意到 MongoDB 有很多函数 在 shell 中 和字段以 understore 开头 表示它们是内部
  • 如何在 WordPress 中创建自定义用户角色 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我必须在 WordPress 中为用户创建审阅者 自定义 角色 如何创建自定义规则 您可以使用add role https devel
  • 带有参数 url 创建的 symfony2 twig 路径

    我得到以下信息 a href Aktivieren a creates 后端 类别 激活 8 1 然后我得到了 a href 这创造了 类别 id 1 看到不同 我想要的是在第二种情况下与第一种情况完全相同 类别 1 我该如何处理这个问题
  • 在 C# 中查询事件日志中消息内容的最简单方法是什么?

    我对 感兴趣编写一些代码来查询 Windows 事件日志以获取特定的错误消息内容 如中所述这篇 MSDN 文章 http msdn microsoft com en us library bb671200 28v vs 90 29 aspx
  • Django 中的 {% %} 和 {{ }}

    我正在学习 Django 遇到了 2 组特殊字符 我以前从未见过这样使用过 我可以猜测它们在示例中的用途 但不了解它们的范围 他们是 if registered user form as p 我添加了if registered and us
  • 为什么“inline-block”元素会自动清除它们的子元素?

    display inline block用于许多clearfixes 1 http css tricks com snippets css clear fix 2 http perishablepress com lessons learn
  • asp.net 中的后台工作者(线程池)

    我有一个 ASP NET Web 表单 它将大约 25 30 个项目 包含用户从表单发出后续请求时所需的信息 写入自定义缓存中 目前 所有这些都是在主线程上同步发生的 但在较高负载下 addcache 正在成为瓶颈 如何在后台运行此任务而不