其实网上关于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. MySQL之自定义函数

    引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利,比如我前面提到过的聚合函数SUM().AVG()以及日期时间函数等等,可是我们总会出现其他的需求:我们需要 ...

  2. 你是否应该使用一个Javascript MVC框架?

    你是否应该使用一个Javascript MVC框架?本文摘自smashingmagazine的Journey Through The JavaScript MVC Jungle部分内容,希望对大家有帮 ...

  3. shell删除指定时间之前的文件

    cat delbak.sh 1 #!/bin/sh 2 location="/root/sqlbak/" 3 find $location -mtime +30 -type f | ...

  4. ASP.NET MVC5 视图预编译

    ASP.NET MVC5 视图预编译 ASP.NET MVC5 视图预编译   关于Razor视图及引擎原理,就不多说了. 这里通俗或者不恰当地说,cshtml视图文件是先编译成dll文件,再通过视图 ...

  5. CSLA .NET是一个.NET软件开发框架

    CSLA .NET是一个.NET软件开发框架,帮助开发者“为Windows.Web.面向服务和工作流等应用构建强大和可维护的业务逻辑层”. CSLA是Component-based, Scalable ...

  6. 设计适用于SOA的类型(二)

    接着上次的,以扩展String类型为例,继续根据自己的使用习惯闭门造车!   这一次我重载了运算符 = 和 + ,我觉得这样更方便我的使用.首先先贴代码: /// <summary> // ...

  7. ASP.NET MVC 使用MSBuild部署的几个注意事项

    ASP.NET MVC 使用MSBuild部署的几个注意事项 做新项目,当时参考NopCommerce的结构,后台Nop.Admin是一个独立的Area Web Site,但部署的时候发现,使用一键发 ...

  8. 字符串拼接 strcat ;数组和指针的区别

    问题:字符串拼接 strcat 方法1: 开辟新空间,存放结果: #include <stdio.h> #include <stdlib.h> #include <str ...

  9. uva 408 Uniform Generator

    Uniform Generator  Computer simulations often require random numbers. One way to generate pseudo-ran ...

  10. 修改List报ConcurrentModificationException异常原因分析

    使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析 在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报jav ...