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 中的后台工作者(线程池) 的相关文章

  • GridView 模板列有条件设置为只读

    有没有办法将 GridView 上的模板列从代码隐藏设置为只读 就像如果测试Admin true make readonly false else readonly true 我发现穆罕默德 阿赫塔尔的答案几乎是正确的 只是我需要在我的案例
  • 更改所选控件的输入语言

    我的应用程序中有一个文本区域 我想以编程方式单独设置文本区域的输入语言 而不影响其他控件 不幸的是 您的程序无法完成此操作 用户需要使用 Unicode 键盘或输入法编辑器 IME 由于您使用的是 C Net 平台 因此您的程序已经能够处理
  • 如何从重定向的查询字符串中删除项目?

    在我的基页中 我需要从查询字符串中删除一个项目并重定向 我不能使用 Request QueryString Remove foo 因为该集合是只读的 有没有什么方法可以获取查询字符串 除了该一项 而无需迭代集合并重新构建它 您可以通过处理原
  • 从asp.net ListBox中获取所有选定的项目

    任何人都知道一个顺利的方法来获得所有selected使用扩展方法在列表框控件中的项目 并且 请不要让我争论与如何获取这样一个列表无关 因为最终一切都使用循环来迭代项目并找到选定的项目 var selected yourListBox Ite
  • 如何从 ASP.net 网站写入 OutputDebugString?

    我需要从网站上的代码输出一些调试信息 我怎样才能打电话OutputDebugString来自 ASP net 网站 并将其显示给运行 DbgView 的用户 Note 网站不支持System Diagnostics Trace TraceW
  • 将图像添加到 ASP.Net 中的单选按钮列表

    我正在尝试将图像添加到单选按钮列表控件 但它不起作用 我试过这个 RadioButtonList2 Items Add new ListItem String Format src Colors Dallas 625527 1 1 png
  • 仅在页面加载时执行 Javascript,而不是回发 (SharePoint)

    我正在尝试在 SharePoint 网站上的自定义页面上加载页面时执行一些 JavaScript 它使用当前用户填充人员选择器 问题是代码也在回发时执行 这是我不希望的 因为它会重置人员选择器的任何更改 我尝试过使用if IsPostBac
  • 混合 ASP.NET WebForms 和 MVC 授权

    我正在尝试将一些 MVC3 功能混合到现有的 WebForms 应用程序中 我遵循了一些指南 除了授权部分之外 一切都已设置完毕并正常工作 现有的应用程序有
  • 什么可能会在一台服务器上导致此错误,而在另一台服务器上则不会?

    我们有一个连接到外部 Web 服务的 ASP Net 网站 几天前它突然停止工作 基本代码是这样的 Try request New ExternalWebService ProcessRequestService Error occurs
  • ASP.NET MVC 多线程

    我想在我的 asp net mvc 应用程序中实现这样的逻辑 user clicks a button gt server executes some time consuming logic in 15 threads i get dat
  • Java-线程与CPU的关系

    我对多线程还很陌生 我正在开发一个项目 尝试在我的 Java 程序中使用 4 个 CPU 我想做类似的事情 int numProcessors Runtime getRuntime availableProcessors ExecutorS
  • 获取 SignalR hub 内的完整 URL

    我正在使用 SignalR 开发一个用户跟踪解决方案 作为学习 SignalR 的有趣项目 用于 ASP NET MVC 应用程序 目前我可以跟踪登录的用户以及他们在特定页面上停留的时间 如果他们移动到另一个页面 我也会跟踪该页面 并且 S
  • 使用 AJAX 或多线程加速页面加载

    我的页面有 5 个部分 每个部分大约需要 1 秒来渲染 Page Load RenderSection1 1 sec RenderSection2 1 sec RenderSection3 1 sec RenderSection4 1 se
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • 设置 runat=server 时输入名称和 id 发生变化

    在我的表单中 我需要插入 文本 类型的不同输入 输入必须是带有名称和 ID 的 html 控件 因为我将此表单发送到外部网址 对于验证 我在所有输入中执行 runat server 然后我可以使用 requiredfieldvalidato
  • 我应该对 ObjectContext 使用 using 关键字吗?

    我在这个网站或 CodeProject 的某个地方读到 好的规则是 如果某个类已经实现了 IDisposable 接口 那么您应该使用 using 关键字 因为使用翻译成 MSIL 的关键字会尝试 最终阻止如下内容 try some log
  • 在 ASP.Net 网站中使用 VBScript 中的变量

    我花了一天的大部分时间来研究这个问题 但找不到答案 我对 stackoverflow 比较陌生 询问多个问题是否有一定的礼仪 过去几天我问了三个问题 Anyways 这是代码隐藏文件中的代码 它执行脚本 systeminfo vbs 并且工
  • 如何在ASP.NET服务器的web.config文件中使用Azure Pipeline中设置的环境变量?

    我打算在 ASP NET 中使用 Azure Pipeline 中的以下环境变量web config file
  • 获取 FTP 服务器上的文件大小并将其放在标签上

    我正在尝试获取托管在FTP服务器并将其放入Label而 BackgroundWorker 在后台工作 我在用着 Try 来获取该值 但是该值在第一次尝试时被捕获 下载后 如果我按尝试再次获取它 那么它就可以工作 Note 第一次尝试时进度条
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数

随机推荐

  • 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 正在成为瓶颈 如何在后台运行此任务而不