C# 使用Hangfire调度的任务不';无法在.NET核心控制台应用程序中触发
我正试图用Hangfire在我的C# 使用Hangfire调度的任务不';无法在.NET核心控制台应用程序中触发,c#,hangfire,C#,Hangfire,我正试图用Hangfire在我的控制台应用程序中实现方法的触发 这就是我的程序类的样子: internal class Program { private static IServiceProvider Provider { get; set; } private static void Main(string[] args) { Program program = new Program(); program.ConfigureDI()
控制台应用程序中实现方法的触发
这就是我的程序类的样子:
internal class Program
{
private static IServiceProvider Provider { get; set; }
private static void Main(string[] args)
{
Program program = new Program();
program.ConfigureDI();
program.InitializeScheduledJob("* * * * *");
}
private void ConfigureDI()
{
var configuration = GetConfiguration();
var services = new ServiceCollection();
services.AddSingleton<IConfiguration>(configuration);
services.AddScoped<ITestService, TestService>();
Provider = services.BuildServiceProvider();
}
private IConfigurationRoot GetConfiguration()
{
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile($"appsettings.{environmentName}.json", true, true);
return configurationBuilder.Build();
}
private void InitializeScheduledJob(string cron)
{
var testService = Provider.GetService<ITestService>();
var configuration = Provider.GetService<IConfiguration>();
var scheduledJobId = configuration.GetSection("ScheduledJobId");
var hangfireConnectionString = configuration.GetSection("ConnectionStrings:HangfireConnection");
GlobalConfiguration.Configuration.UsePostgreSqlStorage(hangfireConnectionString.Value, new PostgreSqlStorageOptions { QueuePollInterval = TimeSpan.FromSeconds(1) });
using (var server = new BackgroundJobServer())
{
RecurringJob.AddOrUpdate(scheduledJobId.Value, () => testService.TestMethodAsync(), cron);
}
}
}
内部类程序
{
专用静态IServiceProvider提供程序{get;set;}
私有静态void Main(字符串[]args)
{
程序=新程序();
program.ConfigureDI();
程序。初始化计划作业(“****”);
}
私有void ConfigureDI()
{
var-configuration=GetConfiguration();
var services=newservicecolection();
services.AddSingleton(配置);
services.addScope();
Provider=services.BuildServiceProvider();
}
私有IConfigurationRoot GetConfiguration()
{
var environmentName=Environment.GetEnvironmentVariable(“ASPNETCORE_环境”);
var configurationBuilder=new configurationBuilder();
configurationBuilder.AddJsonFile($“appsettings.{environmentName}.json”,true,true);
返回configurationBuilder.Build();
}
私有void InitializeScheduledJob(字符串cron)
{
var testService=Provider.GetService();
var configuration=Provider.GetService();
var scheduledJobId=configuration.GetSection(“scheduledJobId”);
var hangfireConnectionString=configuration.GetSection(“connectionString:HangfireConnection”);
GlobalConfiguration.Configuration.UsePostgreSqlStorage(hangfireConnectionString.Value,新的PostgreSqlStorageOptions{QueuePollInterval=TimeSpan.FromSeconds(1)});
使用(var server=newbackgroundjobserver())
{
RecurringJob.AddOrUpdate(scheduledJobId.Value,()=>testService.TestMethodAsync(),cron);
}
}
}
正如您所看到的,我在应用程序中使用DI,并试图调用TestService
服务中的TestMethodAsync
方法,但尽管将其添加为定期作业,但它从未被调用
可能是什么问题?可以对问题语句进行优化,使其仅提供代码的非工作部分,从广义上讲,代码看起来不错,但如果在运行时没有正确获取值,则这可能会有问题。1.方法TestMethodAsync()
中有什么内容,2。做一个没有DI的简单样品是可行的。3.您正在传递一个Func
作为参数,根据我的理解,如何执行该参数这里需要执行任务,这是您缺少的,因此没有方法execution@MrinalKamboj没有DI的样本可以工作,所以一定是DIP有问题,请提供工作的代码,这里的想法是调试并找出调用提供程序时填写的内容。GetService()
不是它的TestService
,那么它将是空的,调试DI框架并理解问题不应该是复杂的问题语句可以细化为只提供代码的非工作部分,从广义上讲,代码看起来不错,但若在运行时并没有正确获取值,这可能会有问题。1.方法TestMethodAsync()
中有什么内容,2。做一个没有DI的简单样品是可行的。3.您正在传递一个Func
作为参数,根据我的理解,如何执行该参数这里需要执行任务,这是您缺少的,因此没有方法execution@MrinalKamboj没有DI的样本可以工作,所以一定是DIP有问题,请提供工作的代码,这里的想法是调试并找出调用提供者时填写的内容。GetService()
不是它的TestService
,那么它将是空的,调试DI框架并理解问题并不复杂