小编Dmy*_*tov的帖子

.NET Core Console应用程序中的重复任务

简短的版本是-我如何(在2017年已经对.NET核心1.1发布)运行重复任务在.NET核心控制台应用程序微软的依赖注入

长篇故事和代码片段.

目标

我有4个(并且将有更多)服务,每个服务都有一个执行某个独立任务并与数据库交互的方法.具体来说,我有一个服务从数据库中删除旧数据,一个服务"缓存"数据(在数据库中运行数据并将聚合结果存储在其他表中),一个生成随机数据等等...这个想法是以不同的间隔运行这些任务,例如每20秒或每天运行一次.

目前的脏实施

我有一个服务,每个任务都有一个while(true)循环,用DI生成服务,运行任务Thread.Sleep(interval),检查退出条件(类范围标志)和continue/break.大多数方法都是async.

目前的问题

首先,我知道,while(true)并且Thread.Sleep(interval)是一个巨大的黑客(技术债务).其次,我有内存泄漏,我觉得我产生/处置服务的方式与它有关.最后,代码遇到随机错误,吞下所有异常.我无法以任何已知方式捕获它们.

我想要的解决方案

我想实现目标,但如果可能的话

  • 避免使用像Hangfire和Quartz这样的大型框架.我觉得我不需要他们能做到的一小部分.
  • 保持应用程序控制台应用 虽然这是ASP项目的"帮助者",但我希望它能成为一个控制台应用程序并且能够像它一样运行它dotnet daemons.dll并且它无限期地完成它的工作直到我Ctrl+C.它也不应该增长内存和CPU /线程消耗.只要它是一个稳定的数字,它就可以吃掉相当数量的RAM.
  • 使用Microsoft DI.这就是我所有服务的构建方式.
  • 保持我的服务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 …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading .net-core

6
推荐指数
0
解决办法
1802
查看次数

IServiceProvider 垃圾收集/处理

我试图在我的应用程序中调试内存泄漏(请参阅相关问题)并且遇到了一个微笑错误的行为。

在这段代码中(当然是简化的片段):

    while (true)
    {
        using (var context = _serviceProvider.GetRequiredService<IDataContext>())
        {
            Console.WriteLine("Hello");
        }
    }
Run Code Online (Sandbox Code Playgroud)

内存消耗快速增长

如果我注释掉 service spawn,内存消耗是稳定的。

    while (true)
    {
        // using (var context = _serviceProvider.GetRequiredService<IDataContext>())
        // {
            Console.WriteLine("Hello");
        // }
    }
Run Code Online (Sandbox Code Playgroud)

服务已注册为瞬态

我的理解是using声明负责处理服务。var context在 范围内创建,while并且应该在新迭代开始时销毁。

我的第一个想法是 GC 只是没有足够频繁地完成它的工作,但是当消耗的内存量增加时频率不会增加?

为什么我错了?

c# memory-leaks .net-core

5
推荐指数
2
解决办法
2439
查看次数

EF 7:如何以一对多关系加载相关实体

我有以下代码.为什么我的导航属性(课程中的要求和要求中的课程)为空?

    public class Course : AbsEntity {
            [Key]
            public string Title { get; set; }
            public string Term { get; set; }
            public int Year { get; set; }
            public string CourseId { get; set; }        
            public double GradePercent { get; set; }        
            public string GradeLetter { get; set; }     
            public string Status { get; set; }
            public int ReqId { get; set; }

            public Requirement Requirement { get; set; }
        }

    public class Requirement : AbsEntity {
            [Key]
            public …
Run Code Online (Sandbox Code Playgroud)

c# asp.net entity-framework entity-framework-core asp.net-core

4
推荐指数
1
解决办法
7249
查看次数

如何在括号内使用 LaTeX 打印引用?

我在 LaTeX 中的参考样式有问题。我用:

\usepackage[backend=bibtex,style=authoryear]{biblatex} %
Run Code Online (Sandbox Code Playgroud)

但是当我查看参考文献时,文本不在括号内。例如:

,在Roy 等人中进行了评论 。2010年

应该

, 回顾 ( Roy et al. 2010 )

latex

3
推荐指数
1
解决办法
3905
查看次数