Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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# 实现长时间运行的服务(无限长/始终可用)以处理ASP.NET核心Web Api中的数据_C#_.net Core_Asp.net Core Webapi_Backgroundworker_Background Service - Fatal编程技术网

C# 实现长时间运行的服务(无限长/始终可用)以处理ASP.NET核心Web Api中的数据

C# 实现长时间运行的服务(无限长/始终可用)以处理ASP.NET核心Web Api中的数据,c#,.net-core,asp.net-core-webapi,backgroundworker,background-service,C#,.net Core,Asp.net Core Webapi,Backgroundworker,Background Service,我会尽量简化这件事 作为ASP.NET Core Web Api(.NET Core 2.2)的一部分,我正在努力实现一个出租车调度器后台服务,该服务可以无限期运行并处理比赛->为比赛分配司机->在该区域连续获取新司机,并相应地从最近到最远分配给比赛(该服务读取和写入不同的Sql数据库表). 我将后台服务创建为一个托管服务,每当有比赛可用时,它就会执行上述所有操作,并在一个新的后台线程中处理每一场比赛。该api在IIS上的ftp服务器上运行 问题:它在开始时工作正常,但有时服务会超时,无法处理任

我会尽量简化这件事

作为ASP.NET Core Web Api(.NET Core 2.2)的一部分,我正在努力实现一个出租车调度器后台服务,该服务可以无限期运行并处理比赛->为比赛分配司机->在该区域连续获取新司机,并相应地从最近到最远分配给比赛(该服务读取和写入不同的Sql数据库表). 我将后台服务创建为一个托管服务,每当有比赛可用时,它就会执行上述所有操作,并在一个新的后台线程中处理每一场比赛。该api在IIS上的ftp服务器上运行

问题:它在开始时工作正常,但有时服务会超时,无法处理任何传入的比赛,我必须停止api并重新启动它,yikes,这不是我想要的行为,因为我希望我的xamarin forms应用程序能够响应并实时接收比赛

在我编写服务之后,我开始质疑我的实现,我遇到了诸如后台工作者、微服务和工作者服务之类的术语。。现在我更困惑于该解决什么或如何解决问题,以及是否有更好的方法解决这个问题

我在Web Api中使用干净的体系结构设计模式。以下是我在Program.cs文件中注册后台服务的方式:

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureServices(services =>
                {
                    //Some workaround to use the hostedservice as an API
                    //see https://github.com/dotnet/extensions/issues/553
                    services.AddSingleton<BackgroundManagerService>();
                    services.AddSingleton<IHostedService>(p => p.GetService<BackgroundManagerService>());
                })
                .ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //LogLevel.Information
                })
                .UseNLog();  // NLog: Setup NLog for Dependency injection;
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
.ConfigureServices(服务=>
{
//将hostedservice用作API的一些变通方法
//看https://github.com/dotnet/extensions/issues/553
services.AddSingleton();
services.AddSingleton(p=>p.GetService());
})
.ConfigureLogging(日志=>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.logging.LogLevel.Trace);//LogLevel.Information
})
.UseNLog();//NLog:为依赖项注入设置NLog;

谢谢你的帮助

我在使用Hangfire的工作中遇到了类似的问题。虽然你可以随意处理空闲超时和应用程序初始化(仅作为一个例子),但我们最终将所有内容都转移到了.NET核心工作者服务中,并将其作为Windows服务托管


这就是我建议的方法,效果很好。

你意识到你没有问过任何问题吗?@Gusman我问我是否有更好的实现我想要实现的目标的方法(第3段),我认为我是这种高级senario的不速之客:)IIS将控制你的应用程序的生命周期;如果应用程序空闲,它将启动进程并终止应用程序池。只有传入的请求才会导致IIS启动应用程序。有几种方法可以在IIS中控制这一点,但我在保持应用程序始终在IIS上运行方面并没有取得真正的成功。@有一种方法,但它真的很糟糕:创建一个静态计时器,每5-10分钟查询一次您自己的应用程序,这将阻止卸载应用程序。是的,“推荐”(如:工作)解决这个问题的方法是将你的应用程序作为Windows服务托管,而不是通过IIS托管。感谢@julian的友好回答和指出你的建议。上周我已经开始阅读有关工人服务的文章,我应该正在实现我想做的事情的路上。我将标记这一问题的答案,只要我可以得到演示与行为启动和运行。