其实网上关于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. openwrt的GPIO控制

    为什么有些GPIO可以在/sys/class/gpio中控制,而有些不行呢? 先来看一看普通不需要C程序而是使用脚本的控制方法(Linux普遍适用): First step is making GPI ...

  2. C#快速随机按行读取大型文本文件

    原文:C#快速随机按行读取大型文本文件 下面是我实现的一个数据文件随机读取类,可以随机读取大型文本文件的某一行.在我机器上对一个130MB的文本文件,读取第200000的速度从传统做法的400ms提高 ...

  3. Entity Framework 5 自定义代码生成模板 转

    Entity Framework 5 发布有一定时间了,但学习资源确实不多,更何况英语差的我,看英语确实费力,不管怎么样,问题还是解决了,查看很多人写的文章(让我看的想放弃,更想找到答案),都没有到到 ...

  4. class 添加样式,删除,开关 【选择】addClass,removeClass,toggleClass

    <1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>< ...

  5. jenkins+svn+gradle自动化部署笔记

    自己虚拟机jekins配置:(jenkins+svn+gradle)自动化部署,1.linux配置好jdk,解压tomcat,将 jenkins.war翻到webapps目录下.2.系统管理-管理用户 ...

  6. Enterprise Architect UML 建模之活动图

    EA(Enterprise Architect) UML 建模之活动图   一.活动图的概念作用 活动图本质上是一种流程图,它描述活动的序列,即系统从一个活动到另一个活动的控制流. 活动图的作用:描述 ...

  7. TCP应用

    .Net 并行计算 ----并行任务 本文作为 .Net 并行计算 的第二篇 名词解释 任务并行是指一个或者多个独立的任务同时运行.任务并行类似于多线程或者ThreadPool 工作项.但是抽象的级别 ...

  8. Memory Dump 分析器

    Visual Studio 2013 新功能 Memory Dump 分析器   TechEd2013 发现新功能 12月5日和6日,在国家会议中心参加了微软的 TechEd2013 技术大会,了解了 ...

  9. UISearchDisplayController UISearchBar

    分组表+本地搜索 UISearchDisplayController  UISearchBar 的使用 效果图 @interface CityListViewController :UIViewCon ...

  10. GitHub删除文件

    删除单个文件 一般情况下,通常可直接在文件管理器中直接把文件删了,或者用rm命令删了 $ rm README.txt 这个时候,工作区是删除了,可版本库还没有.git status命令会立刻告诉你哪些 ...