在ASP.NET中如何运行后台任务
from:https://blogs.msdn.microsoft.com/scott_hanselman/2014/12/21/asp-net/
[原文发表地址] How to run Background Tasks in ASP.NET
[原文发表时间] 2014-08-26
几年前,Phil Haack写了一篇关于ASP.NET中定期后台任务存在的隐患的优秀文章。他指出了一些人们在后台工作时常见的陷阱。您可阅读这篇文章,下面是他帖子里得出的摘要。
- 在一个线程中,一个与需求不相关的未处理异常将会终止该进程。
- 如果你在一个Web Farm中运行网站,你大概会以你的应用程序里,试图在同一时间运行同样任务的多个实例结束。
- 在AppDomain中运行你的网站会因为种种原因而终止,且后台任务也会随之一起终止。
如果你认为你可以自己写一个后台任务,很可能你会进去误区。我并非怀疑你的技术,只能说这太微妙了。而且,你为什么非要这样做呢?
有很多种方式可以让你在后台工作,有很多资源库和选择可利用。
一些ASP.NET应用程序会承载于你的IIS数据中心里,其他的则将承载于在Azure 云上。在我看来,利用率的频谱大致是这样:
- 通用方法:Hangfire(或者类似的开源资源库)
用于ASP.NET网站上编写后台任务。
- 云方法:Azure WebJobs
一个正规的Azure功能,用来卸载运行于网站之外的后台任务和度量工作量。
- 高级方法:云服务执行器
快速测量网站后台进程的数量,并 且你需要调度这些机器。
有很多介绍如何使用Azure WebJobs的优秀文章和视频,也有很多介绍工作者角色是如何在可扩展的Azure云服务中工作的文档,但是介绍关于如何承载ASP.NET应用程序和轻松拥有一个后台服务的不多。这里列举了一些。
WebBackgrounder
正如它所说的“WebBackgrounder是一个web-farm,友好的后台任务管理器的概念证明,意味着它仅仅与一个普通的ASP.NET web应用程序协作。”多年来,它的代码没有公开,但是WebBackgrounder NuGet 包已经被下载了大约50万次。
这个项目的目的是处理一个任务,在web应用程序的后台时间间隔管理一个循环的任务。
如果你的ASP.NET应用程序仅仅需要一个后台任务来运行一个基本的预定时间间隔,那么你可能需要基本的WebBackgrounder知识。
using System;
using System.Threading;
using System.Threading.Tasks;
namespace WebBackgrounder.DemoWeb
{
public class SampleJob : Job
{
public SampleJob(TimeSpan interval, TimeSpan timeout)
: base("Sample Job", interval, timeout)
{
}
public override Task Execute()
{
return new Task(() => Thread.Sleep(3000));
}
}
}
建立:QueueBackgroundWorkItem-加入.NET4.5.2
在某种程度上对WebBackgrounder的需产生影响,QueueBackgroundWorkItem作为一个新的API被添加于.NET 4.5.2 中。它不只是一个”Task.Run”,它的功能还有很多:
QBWI预设了一个可以在后台运行的任务,它独立于任何需求。这不同于平常的ASP.NET线程池工作项,ASP.NET自动记录有多少个通过API注册的工作项正在运行,并且ASP.NET运行时会延迟AppDomain的关闭,直到工作项停止执行。
为了保证任务完成,它可以延迟AppDomain关闭长达90秒。如果你在90秒内无法完成,那么你需要一个不同的(更健壮的,更有意义的,进程以外的)技术。
这个API非常简单,使用Func<CancellationToken, Task>。这里有一个从MVC截取的后台工作项例子:
public ActionResult SendEmail([Bind(Include = "Name,Email")] User user)
{
if (ModelState.IsValid)
{ HostingEnvironment.QueueBackgroundWorkItem(ct => SendMailAsync(user.Email));
return RedirectToAction("Index", "Home");
}
return View(user);
}
FluentScheduler
FluentScheduler 是一个更精密和复杂的调度程序,它有一个(如你所想)流畅的界面。当你的任务运行时你是真正地显式控制。
using FluentScheduler;
public class MyRegistry : Registry
{
public MyRegistry()
{ // Schedule an ITask to run at an interval
Schedule<MyTask>().ToRunNow().AndEvery(2).Seconds();
// Schedule a simple task to run at a specific time
Schedule(() => Console.WriteLine("Timed Task - Will run every day at 9:15pm: " + DateTime.Now)).ToRunEvery(1).Days().At(21, 15);
// Schedule a more complex action to run immediately and on an monthly interval
Schedule(() =>
{
Console.WriteLine("Complex Action Task Starts: " + DateTime.Now);
Thread.Sleep(1000);
Console.WriteLine("Complex Action Task Ends: " + DateTime.Now);
}).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);
}
}
FluentScheduler 也接受IoC,而且可以通过执行ItaskFactory界面来注入你喜欢的Dependency Injection tool。
Quartz.NET
Quartz.NET是一个拥有和流行的Java 工作调度框架(几乎)相同的名字的.NET端口。它得到了快速地发展。Quartz有一个IJob界面,只有一个用来执行的
using Quartz;
using Quartz.Impl;
using System;
namespace ScheduledTaskExample.ScheduledTasks
{
public class JobScheduler
{
public static void Start()
{
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
IJobDetail job = JobBuilder.Create<MyJob>().Build();
ITrigger trigger = TriggerBuilder.Create()
.WithDailyTimeIntervalSchedule
(s =>
s.WithIntervalInHours(24)
.OnEveryDay()
.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))
)
.Build();
scheduler.ScheduleJob(job, trigger);
}
}
}
然后,在你的应用程序开始之前,你可以调用 JobScheduler.Start()。在Mikesdotnetting上面有一篇关于Quartz启动的优秀文章,你可以查阅。
Hangfire
最后但绝对不是最不重要的是,最优秀的(IMHO)组Hangfire 依从 @odinserj。 它是一个ASP.NET中后台工作极好的框架。为了保证可靠性,它甚至被Redis, SQL Server, SQL Azure, MSMQ, 或 RabbitMQ选择为坚强的后盾。
Hangfire的文档编制真的很神奇。每一个开源项目的文件应该像它这样。ASP.NET的文档编制也应该像它这么好。
Hangfire中最佳的功能是它建立了/hangfire 仪表板,向你展示所有预设的,加工中的,成功的和失败的进程。这真是一个很好的附加功能。
你可以轻易地把“fire和forget”工作加入队列并且它们是支持持久队列的:
|
你可以使用延迟…
|
或者使用大而复杂的CRON风格的循环性任务:
|
Hangfire是很有趣的。
查阅Hangfire 高亮教程可以看到一些复杂的但容易遵循现实世界的例子。
这是一个丰富的资源系统,可以帮助你完成后台任务。所有这些资源库都是卓越的,开源的,并且是可用作NuGet 包的。
我有遗漏你最喜欢的部分吗?如果有请在评论板中提出来!
转载于:https://www.cnblogs.com/94cool/p/5725322.html
在ASP.NET中如何运行后台任务相关推荐
- 让ASP程序在服务器中自动运行
有时候希望ASP网站中的某个页面能够定时执行,可以通过Windows的计划任务来实现: 一.生成计划任务能够执行的vbs代码,例子如下: Dim IE Set IE = CreateObject(& ...
- ASP.NET Core托管运行Quartz.NET作业调度详解
Quartz.NET这么NB的作业调度系统,不会还行? 今天介绍一下Quartz.NET的托管运行,官网传送门. 一.前言 Quartz.NET,按官网上的说法,是一款功能齐全的任务调度系统,从小 ...
- ASP.NET中 RequiredFieldValidator(非空验证)的使用
ylbtech-ASP.NET-Control-Validator: RequiredFieldValidator(非空验证)的使用 ASP.NET中 RequiredFieldValidator(非 ...
- 搜集《ASP.NET中常用的26个优化性能方法》
1. 数据库访问性能优化 a.数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接 ...
- asp.net中web.config配置节点大全详解
web.config 文件查找规则: (1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找. (2)如果当 ...
- 在ASP.NET中跟踪和恢复大文件下载
在Web应用程序中处理大文件下载的问题一直出了名的困难,因此对于大多数站点来说,如果用户的下载被中断了,它们只能说悲哀降临到用户的身上了.但是我们现在不必这样了,因为你可以使自己的ASP.NET应用程 ...
- ASP.NET中如何防范SQL注入式攻击
1将sql中使用的一些特殊符号,如' -- /* ; %等用Replace()过滤: 2限制文本框输入字符的长度: 3检查用户输入的合法性:客户端与服务器端都要执行,可以使用正则. 4使用带参数的SQ ...
- ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页
关键字:DataGrid.存储过程.分页 出自: http://blog.csdn.net/yzx110/archive/2004/08/18/78525.aspx 摘要:在最进的一个项目中因为一个管 ...
- 在ASP.NET中随意创建图形信息
如果没有一个外部组件的支持,在ASP中是不能动态创建图形的,不管它是一个图表,一个横幅或仅仅是一个图形计数器.可喜的是,这一点在ASP.NET中改变了.现在,我们只需要使用内置功能,就能够很容易动态创 ...
最新文章
- J. Cheminform. | 基于SMILES的利用骨架的分子生成模型
- tomcat linux dump,Linux下Tomcat常用命令与配置
- linux下软件实施,linux系统未来或应用广泛
- tomcat连接不上本地mysql_mysql连接不上tomcat
- 好文转发《我现在是这样编程的》
- 有用过PHP SPL的吗,不知道这主要用来干嘛
- 需要微缓存吗? 营救记忆
- [TimLinux] JavaScript 元素动态显示
- python学籍管理系统 flask_taskday05-Python之flask学习 web开发最基本的需要(特别详细且适用)...
- for-in和for-of,forEach和Map
- ubuntu使用CMake时报错compilation terminated找不到头文件解决方法
- tf之 MessageFilter 与 tf::MessageFilter理解与应用
- 计算机信息传输中枢,计算机网络综合布线及线路测试
- html5 easyui 布局,Easyui 在面板中创建复杂布局_EasyUI 插件
- MINIDUMP_TYPE详解
- 《凤凰项目》读书笔记
- 一个超简单的油猴脚本!
- C语言如何统计程序运行时间
- python数据科学包第三天(股票数据分析、时间事件日志)
- 公有云、私有云、私有化_私有云的未来是什么?