Hva er tilsvarende RegisterObject / QueueBackgroundWorkItem i ASP.NET 5

stemmer
8

I System.Web ASP.NET, kan bakgrunnen arbeid registreres via RegisterObject/ QueueBackgroundWorkItemfor å delta på avslutningssekvensen av IIS (komplett med 90 andre grace period), men jeg sliter med å finne den eksakte tilsvarende i ASP. NET 5.

Ser vi på kilden for Microsoft.AspNet.Hosting.HostingEngine, kan jeg ser at det signaler via IApplicationLifecycle.ApplicationStopping, og IApplicationLifecycle.ApplicationStopped(mellom hvilke det råder serveren og PipelineInstance), men det synes ikke å være noe rom for den 90 andre gyldighetsperioden som nødvendiggjør RegisterObjecti den gamle API.

IIS integrering lag har ikke vært åpen hentet ennå (hvis noen), så det er vanskelig å se hvordan det implementeringen maps ting.

Jeg mangler en API? Bør jeg være å utføre en blokkerende avslutning via CancellationToken.Register()? Er det noe som har blitt utelatt fra v1 av vNext?

Enhver opplysning vil bli verdsatt.

Publisert på 28/12/2014 klokken 11:53
kilden bruker
På andre språk...                            


1 svar

stemmer
6

Jeg har opprettet under bruk av Katana-baserte Hangfire implementering som inspirasjon. Det har ingen testing utover å sjekke at nedleggelse kode løp når IIS Express ble avsluttet, men det fungerer som et bevis på konseptet.

Utformingen her er åpenbart ikke for "ild og glemme" oppgaver, siden de kunne bli utløst rett før en nedleggelse. Det gjør imidlertid jobbe for noe sånt som en idempotent kø prosessor (forutsatt idle avslutningstidsavbrudd har blitt deaktivert)

public static class BackgroundServiceExtensions
{
    public static void UseBackgroundService(
        this IApplicationBuilder builder, Func<CancellationToken, Task> service)
    {
        var lifetime = (IApplicationLifetime)builder.ApplicationServices
            .GetService(typeof(IApplicationLifetime));

        var stoppingToken = lifetime.ApplicationStopping;
        var stoppedToken = lifetime.ApplicationStopped;

        // This, in particular, would need to be properly thought out, 
        // preferably including an execution context to minimise threadpool use  
        // for async-heavy background services
        Task serviceTask = Task.Run(() => service(stoppingToken));

        stoppedToken.Register(() =>
        {
            try
            {
                // Block (with timeout) to allow graceful shutdown
                if (!serviceTask.Wait(TimeSpan.FromSeconds(30)))
                {
                    // Log: Background service didn't gracefully shutdown. 
                    //      It will be terminated with the host process
                }
            }
            catch(Exception)
            {
                // Ignored
            }
        });
    }
}

Som deretter kan brukes slik:

app.UseBackgroundService(async cancellationToken =>
{
    while (!cancellationToken.IsCancellationRequested)
    {
        System.Diagnostics.Debug.WriteLine("Tick...");

        try
        {
            // Use cancellationToken for anything that is (logically) cancellable
            await Task.Delay(1000, cancellationToken);
        }
        catch(TaskCanceledException)
        { }
    }

    System.Diagnostics.Debug.WriteLine("Cancellation requested, shutting down...");
});
Svarte 31/12/2014 kl. 00:13
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more