代码拉取完成,页面将自动刷新
dotnet core的后台任务组件,控制台和web项目都可以直接用。
Worker
,定义了后台任务以什么样的流程来执行OnceWorker 调用一次执行一次的后台任务,可配置自定义数据。在Action里、服务里、任何其他位置调用. 配置BackRun来执行自己的业务逻辑,一个Worker可以配置多个BackRun。
SynchroWorker 所有后台任务默认都是并行执行,SynchroWorker强制串行执行,基于严格的流程控制,只需要一行代码的拦截器即可把并行任务控制成串行执行。
QueueWorker 队列任务,用QueueWorker添加string到队列,后台任务会立即执行。配置QueueBackRun来写自己的任务逻辑,请自己序列化String,一个Worker可以配置多个QueueBackRun。。
TimeWorker 简单的周期执行任务,配置一个TimeSpan,周期循环执行定义的BackRun。继承BackRun/ScopeBackRun来写自己的任务逻辑。
PlanTimeWorker 按时间计划执行的任务,配置Cro表达式(Cron表达式的简化版),在指定时间执行BackRun。继承BackRun/ScopeBackRun来写自己的任务逻辑。一个BackRun可以配置多个时间计划,一个时间计划可以对应多个不同类型的BackRun。
nuget搜索Brun 或自己编译
//自己任务逻辑的例子,队列任务请继承QueueBackRun
public class TestHttpWorker : BackRun
{
public async override Task Run(CancellationToken stoppingToken)
{
for (int i = 0; i < 1; i++)
{
var log = GetRequiredService<ILogger<TestHttpWorker>>();
HttpClient httpClient = new HttpClient();
var r = await httpClient.GetAsync("http://127.0.0.1:5000/", stoppingToken);
log.LogWarning("httpClient发起了请求,state:" + r.StatusCode);
//也能使用自带的ioc获取服务,瞬时和单例可以直接取,Scoped的需要自己创建CreateScope
IHttpClientFactory factory = GetRequiredService<IHttpClientFactory>();
var fclient = factory.CreateClient();
var fr = await fclient.GetAsync("http://127.0.0.1:5000/", stoppingToken);
log.LogWarning("fclient发起了请求,state:" + fr.StatusCode);
using (var scope = NewScope())
{
var testScope = scope.ServiceProvider.GetRequiredService<ITestScopeService>();
string scopeR = testScope.Todo();
log.LogInformation(scopeR);
}
}
}
}
public class Program
{
public static string BrunKey = Guid.NewGuid().ToString();
public static string QueueKey = Guid.NewGuid().ToString();
public static string TimeKey = Guid.NewGuid().ToString();
public static string ScopeKey = Guid.NewGuid().ToString();
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices(services =>
{
//其他服务
services.AddHttpClient();
//services.AddScoped<ITestScopeService, TestScopeService>();
//配置单次任务
WorkerBuilder.Create<TestHttpWorker>()
.SetKey(BrunKey)
.Build();
WorkerBuilder.Create<LongTimeBackRun>()
.Add<LongTimeBackRun>()//同一个OnceWorker中配置多个BackRun,使用:worker.RunDontWait<TBackRun>()
.SetName(nameof(LongTimeBackRun))
.Build();
//配置Scope任务
//WorkerBuilder.Create<TestScopeBackRun>()
//.SetKey(ScopeKey)
//.Build();
//配置队列任务
WorkerBuilder.CreateQueue<TestQueueWorker>()
.AddQueue<TestQueueErrorWorker>()//配置多个QueueBackRrun,使用:worker.Enqueue<TQueueBackRun>(msg)
.SetKey(QueueKey)
.Build();
//配置简单循环执行任务
//WorkerBuilder.CreateTime<ErrorTestRun>()
WorkerBuilder.CreateTime<LongTimeBackRun>()
.SetCycle(TimeSpan.FromSeconds(5), true)
.SetKey(TimeKey)
.Build()
;
//配置复杂时间计划任务
WorkerBuilder.CreatePlanTime<LogTimeRun>("0/5 * * * *", "3,33,53 * * * *", "5 * * * *", "* * * * *")
.AddPlanTime<ErrorTestRun>("* * * * *")
.SetKey(PlanKey)
.Build();
//启动后台服务
services.AddBrunService();
})
;
}
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
Brun.IWorkerServer _workerServer;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
_workerServer = WorkerServer.Instance;//或者构造函数中用 IWorkerServer 取
}
public IActionResult Index()
{
return View();
}
public IActionResult Once()
{
//运行后台任务
_workerServer.GetOnceWorker(Program.BrunKey).RunDontWait();
return View();
}
public IActionResult Queue(string msg)
{
//运行队列任务
IQueueWorker worker = _workerServer.GetQueueWorker(Program.QueueKey);
for (int i = 0; i < 100; i++)
{
worker.Enqueue(msg);
}
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
Cro域的格式,5-6个域以空格分开
秒(0-59) | 分(0-59) | 时(0-23) | 日/星期(1-31/1-7) | 月(1-12) | 年(1970-2099) |
---|---|---|---|---|---|
* , - / 数字 | * , - / 数字 | * , - / 数字 | * , - L 数字 X | * , - / 数字 | 可空 * , - / 数字 |
例子
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型