托管服务.Net

编程入门 行业动态 更新时间:2024-10-21 17:23:56
本文介绍了托管服务.Net-Core的集成测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有一个要测试的QueueTask托管服务(.Net-Core的新后台服务).我的queuedHosted服务看起来像这样:

I have a QueueTask Hosted service (.Net-Core's new background service) that I'd like to test. My queuedHosted service looks like so:

public QueuedHostedService(IServiceProvider serviceProvider, IBackgroundTaskQueue taskQueue, ILoggerFactory loggerFactory) { TaskQueue = taskQueue; _logger = loggerFactory.CreateLogger<QueuedHostedService>(); _serviceProvider = serviceProvider; } protected async override Task ExecuteAsync(CancellationToken stoppingToken) { using (var scope = _serviceProvider.CreateScope()) { while (false == stoppingToken.IsCancellationRequested) { var workItem = await TaskQueue.DequeueAsync(stoppingToken); try { await workItem(scope.ServiceProvider, stoppingToken); } catch (Exception ex) { this._logger.LogError(ex, $"Error occurred executing {nameof(workItem)}."); } } } }

它只是从队列中读取任务,并在传入任务时执行它们.我已经验证了托管服务正在生产中.我为它写了一个测试,如下所示:

It just reads tasks from the queue and executes them as they come in. I've already verified that the Hosted Service is working in Production. I wrote a test for it like so:

[TestMethod] public async Task Verify_Hosted_Service_Executes_Task() { IServiceCollection services = new ServiceCollection(); services.AddSingleton<ILoggerFactory, NullLoggerFactory>(); services.AddHostedService<QueuedHostedService>(); services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>(); var serviceProvider = services.BuildServiceProvider(); var backgroundQueue = serviceProvider.GetService<IBackgroundTaskQueue>(); var isExecuted = false; backgroundQueue.QueueBackgroundWorkItem(async (sp, ct) => { isExecuted = true; }); await Task.Delay(10000); Assert.IsTrue(isExecuted); }

但是,我的回叫从未被打过.如何让我的任务在后台服务上执行?

However, my call back is never hit. How can I get my task to executue on the Background Service?

修改

我模仿的是创业公司,假设后台服务可以正常工作, 但显然我的服务从未启动,

I was mimicking the startup, and assumed by background service would just work, but apparently my service is never started,

如何从.Net-Core开始规范托管服务?

How is the Hosted Service normalled Started from .Net-Core?

推荐答案

托管服务是框架启动的,是WebHost启动过程的一部分

Hosted services are started by the framework as part of the WebHost's start process

// Fire IHostedService.Start await _hostedServiceExecutor.StartAsync(cancellationToken).ConfigureAwait(false);

收集所有已注册的IHostedService,枚举并依次启动

via the HostedServiceExecutor which would take a collection of all the registered IHostedService, enumerate them and start them in turn

public HostedServiceExecutor(ILogger<HostedServiceExecutor> logger, IEnumerable<IHostedService> services) { _logger = logger; _services = services; } public async Task StartAsync(CancellationToken token) { try { await ExecuteAsync(service => service.StartAsync(token)); } catch (Exception ex) { _logger.ApplicationError(LoggerEventIds.HostedServiceStartException, "An error occurred starting the application", ex); } }

来源

但是,由于您要单独测试托管服务,因此您必须充当框架并自己启动服务.

But since you are testing the hosted service on its own, you have to act as the framework and start the service yourself.

[TestMethod] public async Task Verify_Hosted_Service_Executes_Task() { IServiceCollection services = new ServiceCollection(); services.AddSingleton<ILoggerFactory, NullLoggerFactory>(); services.AddHostedService<QueuedHostedService>(); services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>(); var serviceProvider = services.BuildServiceProvider(); var service = serviceProvider.GetService<IHostedService>() as QueuedHostedService; var backgroundQueue = serviceProvider.GetService<IBackgroundTaskQueue>(); await service.StartAsync(CancellationToken.None); var isExecuted = false; backgroundQueue.QueueBackgroundWorkItem(async (sp, ct) => { isExecuted = true; }); await Task.Delay(10000); Assert.IsTrue(isExecuted); await service.StopAsync(CancellationToken.None); }

更多推荐

托管服务.Net

本文发布于:2023-11-15 22:38:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1598582.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:托管服务   Net

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!