Замена IRegisteredObject в ASP.NET 5?

Я пытаюсь создать простое приложение ASP.NET 5 с SignalR, которое должно регулярно отправлять сообщения клиентам (например, реализовать панель мониторинга со значениями, передаваемыми с сервера в браузер).

Я изучил некоторые сообщения, такие как http://arulselvan.net/realtime-dashboard-asp-net-signalr-angularjs-d3js/ или http://henriquat.re/server-integration/signalr/integrateWithSignalRHubs.html. Они рекомендуют реализовать таймер в классе, реализующем IRegisteredObject из пространства имен System.Web.Hosting.

Однако, похоже, я не могу найти пространство имен, в котором IRegisteredObject живет в ASP.NET 5. System.Web больше не существует в ASP.NET 5. Мне не удалось найти информацию о нем в Интернете. Чем заменить его в ASP.NET 5?

ОБНОВЛЕНИЕ

Я пробую следующее решение:

  • создать сервис, инкапсулирующий таймер

  • зарегистрируйте его в Startup.cs как одноэлементную службу, например.

    public class Ticker
    {
        Timer timer = new Timer(1000);
        public Ticker()
        {
            timer.Elapsed += Timer_Elapsed;
            timer.Start();
        }
    
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
          // do something
        }
    }
    

In Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        // ... 
        Ticker ticker = new Ticker();
        ServiceDescriptor sd = new ServiceDescriptor(typeof(Ticker), ticker);
        services.Add(sd);
        // ...
    }

Как насчет этого подхода?


person AunAun    schedule 18.04.2016    source источник
comment
Как насчет метода HostingEnvironment.QueueBackgroundWorkItem? Был введен с .NET 4.5, он заменяет IRegisteredObject.   -  person Anders    schedule 19.04.2016
comment
Нет, тоже не нашел. Он находится в System.Web.Hosting — похоже, этого пространства имён больше не существует, как и самого System.Web   -  person AunAun    schedule 19.04.2016
comment
что касается вашего обновления, есть понятие отмены, фоновое задание должно быть завершено, когда пул приложений обновится.   -  person Anders    schedule 19.04.2016


Ответы (1)


IRegisteredObject в основном просто дает способ уведомить реализующий класс о надвигающейся гибели, как только ваш экземпляр зарегистрирован в HostingEnvironment.RegisterObject.

В ядре .net нет необходимости реализовывать какой-либо интерфейс. Соответствующий метод HostingEnvironment.RegisterObject: IHostApplicationLifetime.ApplicationStopping.Register.

В вашем приложении IoC обязательно получите зависимость от IHostApplicationLifetime для объекта или диспетчера заданий или чего-то еще, чтобы иметь возможность зарегистрировать или как-то связать его в Startup.cs Configure, где к экземпляру этого интерфейса может получить доступ инфраструктура IoC:

public void Configure(IApplicationBuilder app,
    IHostApplicationLifetime applicationLifetime)
{
    // Pipeline setup code ...

    applicationLifetime.ApplicationStopping.Register(() => { 
        // notify long-running tasks of pending doom  
    });
}

Изменить для asp.net core v2 и более поздних версий: интерфейс IHostedService и реализация BackgroundService также следует упомянуть здесь, так как это актуальная альтернатива для того же сценария.

Изменить для asp.net core v3 и более поздних версий: интерфейс IApplicationLifetime помечен как устаревший (начиная с ~3.0), используйте IHostApplicationLifetime для новой разработки.

person Tewr    schedule 14.03.2017