其实网上关于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. MVC6 - 视图组建

    MVC6 - 视图组建 VS2015 PERVIEW中可以创建MVC6 项目. 我们可以 发现有几大亮点. 首先我们看目录结构: 当前项目包含两个主要的文件夹:Solution Items .src ...

  2. Perl基础(1)chop与chomp的区别

    chop是去掉字符串的最后一个字符 chomp是去掉"$/"指定的结尾符号 测试程序一: [perl] #!/bin/perl $tmp = "sincere" ...

  3. 个人实现的一个简单的蜗牛矩阵(c语言)

    #include<stdio.h> #include<stdlib.h> int main(void) { int n,m; int x,y; int **array; int ...

  4. IE低版本下实现html5的placeholder(表单提示)功能

    placeholder 属性提供可描述输入字段预期值的提示信息(hint). 该提示会在输入字段为空时显示,并会在字段获得焦点时消失. 注释:placeholder 属性适用于以下的 <inpu ...

  5. 一步一步实现基于Task的Promise库(五)waitFor和waitForAny的实现

    在实现waitFor方法之前,我们先要搞明白下面这些问题: 1. waitFor方法的形参有限制吗? 没有!如果形参是Task类型,不应该启动Task,如果是function类型,会执行方法.所以wa ...

  6. MVC应用程序显示上传的图片

    MVC应用程序显示上传的图片 前两篇<MVC应用程序实现上传文件>http://www.cnblogs.com/insus/p/3590907.html和<MVC应用程序实现上传文件 ...

  7. Winform系列

    小菜学习编程-Winform系列(初学者)   前言 记得上次写<小菜的程序员道路(二)>,这篇文章的时候说过,要把工作以来整理的编程知识分享给大家,因为这半年来的工作实在是忙,现在也在忙 ...

  8. Django数据库迁移

    如果你用过Django的数据库就会发现一个比较令人纠结的地方:数据库更改. 我们知道添加或者删除一个models.Model 需要在数据库里相应的操作,这需要我们进入数据库命令行手动添加或删除,因为s ...

  9. Microsoft Push Notification Service(MPNS)的最佳体验

    如何获得 Microsoft Push Notification Service(MPNS)的最佳体验 有很多同学抱怨MPNS的各种问题,其中包括服务超时.返回各种错误代码不知如何处理等等..今天我用 ...

  10. Best Cow Line(POJ No.3617)

    问题: 链接:http://poj.org/problem?id=3617 思路: 按照字典序比较S和将S反转后的字符串S' 如果S较小,就从S的开头取出一个字符,加到T的末尾(更新下标值) 如果S’ ...