其实网上关于HostingEnvironment 的RegisterObject和QueueBackgroundWorkItem文章已经很多了,典型是的

QueueBackgroundWorkItem to reliably schedule and run background processes in ASP.NET

Fire and Forget on ASP.NET   该文章里面涉及到一个开与项目 AspNetBackgroundTasks

而我本次的测试也是基于AspNetBackgroundTasks来测试的,Fire and Forget on ASP.NET里面提到了3点:个人英文不太好 就把原文贴出来吧

大致意思就是Task.Run, Task.Factory.StartNew, Delegate.BeginInvoke, ThreadPool.QueueUserWorkItem 像这样的code, 在应用程程序域的DomainUnload以后,马上消失;在4.5.2 以后我们可以考虑 HostingEnvironment.QueueBackgroundWorkItem方法,它在 在应用程程序域的DomainUnload以后可以坚持30秒,后面我测试过也差不多就是这个时间。推荐做法就是用 HostingEnvironment.RegisterObject 它坚持的时间更长(我本地测试大致为5分钟)。

先看看 我的demo, 系统中总有一些比较耗时的操作, 通常我们可以采用分布式消息队列来实现,网上发现有人用 BlockingCollection<UserInfo>(new ConcurrentQueue<UserInfo>())来做简单的消息队列,那么我的担心就 出来了,BlockingCollection是线程安全的,但是它毕竟驻留在IIS进程里面,如果在release 跟新的时候,iis程序池会回收,BlockingCollection没有处理的数据是否会丢失?

先看看code吧,AsyncService每隔1秒就处理一条数据

public class UserInfo
{
public string UserName { set; get; }
}
public class AsyncService
{
public static BlockingCollection<UserInfo> UerQueue;
static AsyncService()
{
UerQueue = new BlockingCollection<UserInfo>(new ConcurrentQueue<UserInfo>());
}
public static void Start()
{
DateTime start = DateTime.Now;
foreach (UserInfo item in UerQueue.GetConsumingEnumerable())
{
ProcessUserInfo(item,(DateTime.Now-start).TotalSeconds);
Thread.Sleep();
}
}
private static void ProcessUserInfo(UserInfo userInfo,double seconds)
{
System.Diagnostics.Debug.WriteLine(userInfo.UserName+"------------"+seconds.ToString());
}
}

在HomeController往队列里面加数据

 public ActionResult Index()
{
for (int i = ; i < ; i++)
{
AsyncService.UerQueue.Add(new UserInfo { UserName=$"ma jiang -{i}" });
}
return View();
}

我的实际操作是在程序运行在7-10左右就停止IISExpress

在Application_Start方法里面用:

HostingEnvironment.QueueBackgroundWorkItem(x =>
{
AsyncService.Start();
});

运行结果如图:

也就是说我的IISExpress退出后大概运行了30秒。

调用:

BackgroundTaskManager.Run(() =>
{
AsyncService.Start();
});

运行结果如图:

也就是说我的IISExpress退出后大概运行了300秒

这里推荐一个源码地址 HostingEnvironment.cs  通过阅读源码 已经证实Fire and Forget on ASP.NET里面的描述的准确性。虽然我的测试demo不够完善,但是并不影响结论:推荐使用  HostingEnvironment.RegisterObject方法。

demo下载

该demo 在IIS下测试过, 比如:我们复制bin目录下的文件, 修改config文件 只要应用程序池 的进程ID 还存在,该方案一直可行,如

经过测试,用如下code,只要IIS 应用程序池 进程ID不变(或者说 对应的进程ID存在),中间无论修改bin目录下文件,还是配置文件(也就是网上说的什么应用程序池自动回收的那些东东),都不会影响BackgroundTaskManager.Run里面的code。

BackgroundTaskManager.Run(() =>
{
AsyncService.Start();
});

HostingEnvironment RegisterObject和QueueBackgroundWorkItem的更多相关文章

  1. 定时Job在IIS中潜在危险-IIS 定期回收

    引言 有时我们会在IIS中启用一些定时服务,但是你必须清楚IIS会定期回收Asp.net的应用程序的.首先来看IIS啥时候回收APPDomain.   APPDomain 回收时机 There are ...

  2. 在吉日嘎拉DotNet.WebForm中使用FluentScheduler调度任务

    有些用户一直说系统发送的邮件一直收不到,投诉系统不正常,这时候怎么洗刷冤屈呢?将发送的每一封Email都保存到数据库中,并记录发送的日志,让用户无话可说. 自己创建3个表: MessageFailed ...

  3. 白话学习MVC(九)View的呈现一

    一.概述 本节来看一下ASP.NET MVC[View的呈现]的内容,View的呈现是在Action执行之后进行,Action的执行生成一个ActionResult,[View的呈现]的功能就是:通过 ...

  4. Web服务器(CassiniDev的裁减版)

    做此程序的原因是将软件部署简化,省去IIS的麻烦部署,减少项目实施人员的工作量和工作复杂度 Server sv = , "/", @"D:\web", IPAd ...

  5. 使用FluentScheduler和IIS预加载在asp.net中实现定时任务管理

    FluentScheduler介绍 github地址:https://github.com/fluentscheduler/FluentScheduler FluentScheduler是一个简单的任 ...

  6. 使用IIS应用程序初始化来保持ASP.NET应用程序的活动

    https://weblog.west-wind.com/posts/2013/Oct/02/Use-IIS-Application-Initialization-for-keeping-ASPNET ...

  7. FluentScheduler

    The job configuration is handled in a Registry class. A job is either an Action or a class that inhe ...

  8. ASP.NET MVC 使用FluentScheduler做定时任务

    源代码地址: https://github.com/fluentscheduler/FluentScheduler 使用NuGet安装FluentScheduler 这是我实际项目中用到的代码,也可看 ...

  9. 使用Hangfire MVC 做排程

    Greg Yang Developer Taipei, Taiwan 108 POSTS 35 TAGS 所使用的是 Hangfire 強大排程器有 UI介面可以使用. 首先安裝PM> Inst ...

随机推荐

  1. selenium2入门 用selenium安装、加载、启用插件(一)

    一:下载 下载地址是:http://docs.seleniumhq.org/download/

  2. OCP-1Z0-051-题目解析-第1题

    1. View the Exhibit and examine the structure of the SALES, CUSTOMERS, PRODUCTS, and TIMES tables. T ...

  3. Visual Studio 2012使用水晶报表Crystal Report

    原文:Visual Studio 2012使用水晶报表Crystal Report SAP在 2013年1月14日 released SAP Crystal Reports,developer ver ...

  4. js实现tooltip动态提示效果(文字版)

    页面中经常用到鼠标移动到一个元素上面显示提示的功能,最开始的做法是在下面创建一个div然后动态显示这个div,但是这样需要加很多div,比较麻烦. 针对上面个的需求,这边写了一个tooltip动态提示 ...

  5. C#网络编程系列(两)它Socket同步TCPserver

    声明原文 笔者:竹zz  本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 文章系列文件夹 C#网络编程系列文 ...

  6. 查看SQL SERVER 加密存储过程,函数,触发器,视图

    原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create  PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset noc ...

  7. 百度Web App在线生成平台Site App体验

    最近收到百度开发者中心邮件,告知之前的百度移动建站服务已经升级为Site App了,Site  App顾名思义是可以创建APP的站点,之前想建立一个APP要么是自己制作,要么是选用国外的在线Web A ...

  8. 如何在C++ Builder中使用OpenGL

    作者:太乙散数 摘要:用一个简单的例子,阐述了bcb中使用opengl的简单方法,包括初始化框架.旋转和平移图形.清除图像.初始化背景色以及在刷新时保持图像. 关键词:bcb6 opengl 旋转 清 ...

  9. SpecFlow使用入门之C# BDD

    SpecFlow使用入门 http://www.specflow.org/ SpecFlow是一个BDD工具,在这里对BDD不多赘述,你可以阅读一下微软2010年十二月的一篇文章,此外如果你想要更多了 ...

  10. SZU : A18 (Climb Well)

    Judge Info Memory Limit: 32768KB Case Time Limit: 10000MS Time Limit: 10000MS Judger: Number Only Ju ...