Dmy*_*tov 6 .net c# multithreading .net-core
简短的版本是-我如何(在2017年已经对.NET核心1.1发布)运行重复任务在.NET核心控制台应用程序与微软的依赖注入?
我有4个(并且将有更多)服务,每个服务都有一个执行某个独立任务并与数据库交互的方法.具体来说,我有一个服务从数据库中删除旧数据,一个服务"缓存"数据(在数据库中运行数据并将聚合结果存储在其他表中),一个生成随机数据等等...这个想法是以不同的间隔运行这些任务,例如每20秒或每天运行一次.
我有一个服务,每个任务都有一个while(true)
循环,用DI生成服务,运行任务Thread.Sleep(interval)
,检查退出条件(类范围标志)和continue/break
.大多数方法都是async
.
首先,我知道,while(true)
并且Thread.Sleep(interval)
是一个巨大的黑客(技术债务).其次,我有内存泄漏,我觉得我产生/处置服务的方式与它有关.最后,代码遇到随机错误,吞下所有异常.我无法以任何已知方式捕获它们.
我想实现目标,但如果可能的话
dotnet daemons.dll
并且它无限期地完成它的工作直到我Ctrl+C
.它也不应该增长内存和CPU /线程消耗.只要它是一个稳定的数字,它就可以吃掉相当数量的RAM.async
.我可以在不同的场景中重用它们,包括单元测试.我如何运行重复任务的示例:
private async Task RunCacheServiceAsync()
{
// Make sure the service is set to run.
_status[ServiceManagerServices.Cache] = true;
_logger.LogInformation(LoggingEvents.ServiceManager.AsInt(), "Cache service started.");
while (true)
{
var metrics = await _serviceProvider
.GetRequiredService<DataContext>()
.Metrics
.ToListAsync();
// Run the tasks
var tasks = metrics
.Select(
(metric) =>
Task.Factory.StartNew(async () =>
{
await _serviceProvider
.GetRequiredService<ICacheService>()
.CacheMetric(metric);
})
);
// Wait completion of all tasks
await Task.WhenAll(tasks.ToArray());
// Wait
Thread.Sleep(_intervals[ServiceManagerServices.Cache]);
// Check exit condition
if (!_status[ServiceManagerServices.Cache])
{
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我需要定期执行的任务示例:
public async Task CleanDataPointsAsync()
{
var toTimestamp = DateTime.Now - _maxAge;
// remove data points of all types
_context.RemoveRange(
_context.NumericDataPoints.Where(dp => dp.Timestamp < toTimestamp)
);
await _context.SaveChangesAsync();
_logger.LogInformation(LoggingEvents.Clean.AsInt(), "Cleaned old data.");
}
Run Code Online (Sandbox Code Playgroud)
请提出我可以采取的一般方法来实现考虑约束的目标.任何关于发布的代码和推理的反馈表示赞赏!
归档时间: |
|
查看次数: |
1802 次 |
最近记录: |