ASP.NET Core中应将具有长期连接的类放在哪里?

时间:2019-02-10 10:14:16

标签: c# asp.net-core-mvc

现在我正在使用带有套接字作为属性的类,但我想知道如何以更好的方式处理这种情况。该类在DI中注册为单例,并且套接字上的Connect方法在构造函数中调用。

2 个答案:

答案 0 :(得分:1)

您可以使用IHostedService

它们被设计为在后台运行长时间运行的任务的主要手段。

基本上,您需要做的是创建一个保存您的连接的类,实现IHostedService。 (如果您使用的是.NET Core 2.1+,则可以通过从BackgroundService派生并覆盖ExecuteAsync来轻松实现。

然后,您只需在启动(services.AddSingleton<IHostedService, YourHostedService>())时将其注册为单例课程,框架就会自动识别它并为您管理启动和停止。

有两个优点:

  1. 您不必担心线程太多,主机将负责安排任务的时间。
  2. 该框架将为您处理启动和正常关闭。一切都以您已经知道的方式工作:使用CancellationToken和可配置的超时时间。
  3. 由于该类通过IoC容器注册为常规单例,因此您可以像其他任何类一样通过DI访问它。 (当然,您不仅需要使用IHostedService,还需要使用其他接口进行注册)。这使您可以从控制器等调用套接字管理器上的方法。

这是我的两个有关托管服务的教程,但您也可以找到其他人:

答案 1 :(得分:0)

一种好的技术是创建一种扩展方法,例如针对UseMySocket类型的IWebHostBuilder。您可以在CreateWebHostBuilder类的Program方法中使用它。请记住,您必须以不阻塞当前线程的方式来实现它。例如:

WebHost.CreateDefaultBuilder(args)
.UseMySocket()
.UseStartup<Startup>();

另一种技术是为套接字创建单例类型,然后实例化并将其注入到ConfigureServices类中的Startup方法中的服务集合中。