Создавайте. NET BackgroundService динамически и управляйте временем жизни - PullRequest
0 голосов
/ 01 августа 2020

У меня есть фоновая служба в. NET ( BackgroundService )

public class MyService<TElement, TKey, TValue> : BackgroundService

Он работает в Startup, и я настроил его следующим образом:

_serviceCollection.AddHostedService<MyService<TElement, TKey, TValue>>();

_serviceCollection - это IServiceCollection instance.

Это прекрасно и отлично работает.

Я разрабатываю тест и хочу создать экземпляры MyService Background Сервис динамически основан на вызовах веб-API. Я уже создаю их в памяти при вызове веб-API.

У меня есть три вызова: Create, Start и Stop. Один будет создавать фоновую службу в памяти, а другой запускать и останавливать соответственно.

У меня есть этот вызов для запуска фоновой службы.

 [HttpPost("myservice/perf/start")]
        public async Task<IActionResult> StartServiceAsync(CancellationToken cancellationToken, [FromBody] ServiceParameters params)
        {
            await Task.Run( () => {
                // Start the consumer service if not already started
                // retrieve service instance 
                var _myServiceInstance = GetMyService( params );

                _myServiceInstance .StartAsync(new CancellationToken());  
            });

        }

Я не уверен, что он работает. Несмотря на то, что я вижу точку останова в методе ExecuteAsync, принадлежащем моей фоновой службе, я не могу выполнить построчно, она просто исчезает. Я не уверен, правильно ли я запускаю его или он отменяется при закрытии HTTP-запроса (поэтому я использую новый токен CancellationToken вместо того, чтобы передавать его из вызова POST контроллера).

Я хочу запустить фоновая служба асинхронно. У меня также есть еще один вызов контроллера, чтобы остановить MyService (он вызовет вызов StopAsyn c)

Я что-то делаю не так?

...