Бежать.Объем основного веб-приложения и запустить процесс одновременно
Я пытаюсь добиться одного: бежать .Объем основного веб-приложения (с помощью Kestrel) и запустить кварцевые.Чистый процесс, который выполнял бы некоторые методы. Но все мои попытки были безуспешны. Они оба работают отдельно, но я не могу управлять ими одновременно.
Мой процесс все время работает на сервере linux, где он должен проверять наличие изменений в базе данных. Мне нужно было добавить веб-страницу, чтобы увидеть результаты печати. Поэтому я хочу иметь возможность просматривать эти результаты в интернете (localhost:5000), но также и для того, чтобы процесс продолжал работать.
Возможно ли сделать то, чего я пытаюсь достичь? (запустите веб-процесс и консольный процесс, и пусть они оба работают до тех пор, пока программа запущена)?
Что я уже пробовал:
это мой класс "Startup.cs":
public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddSingleton(); services.AddLogging(); var serviceProvider = services.BuildServiceProvider(); services.AddMvc(); services.AddSingleton(Configuration); return WindsorRegistrationHelper.CreateServiceProvider(ContainerManager.Container, services); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseBrowserLink(); app.UseDeveloperExceptionPage(); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
а это мой класс Program.cs. Веб-работа сейчас, однако процесс еще не запущен. Комментируемый код-это один из многих способов, которыми я пытался запустить оба, но потерпел неудачу.
class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true) .AddCommandLine(args) .Build(); return host = new WebHostBuilder() .UseKestrel() .UseConfiguration(config) .UseStartup() .Build(); } //static void Main(string[] args) //{ // var ConsOut = Console.Out; // Console.SetOut(new StreamWriter(Stream.Null)); // BuildWebHost(args).Start(); // Console.SetOut(ConsOut); // while (true) // { // RunIbit(); // } //} //public static IWebHost BuildWebHost(string[] args) //{ // var config = new ConfigurationBuilder() // .SetBasePath(Directory.GetCurrentDirectory()) // .AddJsonFile("appsettings.json", optional: true) // .AddCommandLine(args) // .Build(); // var host = new WebHostBuilder() // .UseKestrel() // .UseConfiguration(config) // .UseStartup() // .UseIISIntegration() // .Build(); // return host; //} public static void RunIbit() { IServiceCollection services = new ServiceCollection(); Startup startup = new Startup(); var serviceProvider = startup.ConfigureServices(services); IWindsorContainer container = serviceProvider.GetService(); var configuration = container.Resolve(); var cron = configuration[Enums.ExecutionTime]; var _logger = container.Resolve(); var isRunning = false; Execute(cron); while (true) { if (!isRunning) { isRunning = true; } } } public static async void Execute(string cron) { NameValueCollection props = new NameValueCollection { { "quartz.serializer.type", "binary" } }; StdSchedulerFactory factory = new StdSchedulerFactory(props); var sched = await factory.GetScheduler(); await sched.Start(); var job = JobBuilder.Create() .Build(); var trigger = TriggerBuilder.Create() .WithCronSchedule(cron) .ForJob(job.Key) .Build(); await sched.ScheduleJob(job, trigger); } } [PersistJobDataAfterExecution] [DisallowConcurrentExecution] public class Job : IJob { public Task Execute(IJobExecutionContext context) { var key = context.JobDetail.Key; try { var t = new Task(() => { process.MainProcess(); }); return Task.CompletedTask; } catch (Exception e) { } return null; } }