Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Main开始的类中的iLogger_C#_Asp.net Core_Ilogger - Fatal编程技术网

C# 从Main开始的类中的iLogger

C# 从Main开始的类中的iLogger,c#,asp.net-core,ilogger,C#,Asp.net Core,Ilogger,与伊洛格扭打。对我来说,目前还不清楚如何在web控制器之外实例化日志实例 总的来说,我正在准备一个“版本监视器”: 在版本监视器构造函数中,我启动了一个计时器: public VersionMonitor() { Timer timer = new Timer(); timer.Interval = UpInterval; timer.Elapsed += new ElapsedEventHandler(ti

与伊洛格扭打。对我来说,目前还不清楚如何在web控制器之外实例化日志实例

总的来说,我正在准备一个“版本监视器”:

在版本监视器构造函数中,我启动了一个计时器:

public VersionMonitor()
        {
            Timer timer = new Timer();
            timer.Interval = UpInterval;
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Enabled = true;
         }
我现在想做的就是在经过的计时器事件中记录某事:

   static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
            //how to?
            ILogger<timer_Elapsed> _logger;
            logger.LogInformation("Message");
    }
static void timer\u已过(对象发送器,ElapsedEventArgs e)
{
//怎么做?
ILogger\u记录器;
logger.LogInformation(“消息”);
}
你能告诉我怎么做吗


提前感谢。

不要直接实例化您的类,而是查看官方托管服务。它们应该与DI很好地集成,这样就可以得到一个注入式记录器。检查。他们甚至有计时器的例子

public class VersionMonitor: IHostedService, IDisposable
{
    ILogger<VersionMonitor> _logger;
  
    Timer _timer;

    public VersionMonitor(ILogger<VersionMonitor> logger)
    {
        _logger = logger;
        _timer = new Timer();
        _timer.Interval = UpInterval;
        _timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {        
        _timer.Enabled = true;
    }

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        _logger.LogInformation("Message");
    }

     public void Dispose()
    {
        _timer?.Dispose();
    }
}
公共类版本监视器:IHostedService,IDisposable
{
ILogger\u记录器;
定时器(u定时器),;
公共版本监视器(ILogger记录器)
{
_记录器=记录器;
_定时器=新定时器();
_timer.Interval=UpInterval;
_timer.appeased+=新的ElapsedEventHandler(timer\u appeased);
}
公共任务StartSync(CancellationToken CancellationToken)
{        
_timer.Enabled=true;
}
无效计时器已过(对象发送器,ElapsedEventArgs e)
{
_logger.LogInformation(“消息”);
}
公共空间处置()
{
_计时器?.Dispose();
}
}
然后把它连接起来:

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.AddHostedService<VersionMonitor>();
        });
publicstaticvoidmain(字符串[]args)
{
CreateHostBuilder(args.Build().Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
})
.ConfigureServices(服务=>
{
services.AddHostedService();
});

哇,太棒了。多酷的解决方案啊。是否也可以在程序代码的任何其他地方访问VersionMonitor的运行实例?非常感谢。@Airway为什么您需要在其他地方访问它?你打算用它做什么?在类中,计时器所在的位置,我有一些其他函数,我在计时器中部分使用,但我也希望在代码之外的特殊情况下使用。@Airway那么听起来你需要创建另一个类,这样其他每个类都可以引用它。Mhhh,是的,谢谢,最有意义的是:-)
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.AddHostedService<VersionMonitor>();
        });