ASP.NET Hosting Tips - Hvordan avbestiller Oppgaver i .NET 4.0

Det er flere krav for å tillate sletting av en oppgave?. Først må du generere en token som vil bidra til å koordinere avbestilling. Token i seg selv er en forekomst av CancellationToken struktur. Token ikke startes ved hjelp av en konstruktør. I stedet du opprette en forekomst av CancellationTokenSource klassen og lese token fra sin Token eiendom.

.NET 4.0 introduserer en lett struct kalt CancellationToken som gir en mekanisme for å avbryte synkrone og asynkrone operasjoner. Her er noen viktige medlemmer av denne struct:

IsCancellationRequested - en boolsk egenskap som kan hentes av koden for å finne ut om det har blitt kansellert eller avbestillings har blitt forespurt

Register - til registrere en representant for en tilbakeringing når en avbestilling forespørsel har blitt gjort.

Når du oppretter oppgaver som støtter kansellering, passerer du token til Task konstruktør i tillegg til representanten for å utføre. Token må også være tilgjengelig innen representanten slik at du kan få tilgang til sine egenskaper og metoder. Disse inkluderer IsCancellationRequested eiendom, som returnerer en boolsk verdi som angir om kansellering har eller ikke har blitt forespurt.

Den siste delen av støtte kansellering er å sikre at din oppgave kan stoppe grasiøst og la systemet i en gyldig tilstand. Innen langvarige oppgaver bør du med jevne mellomrom sjekke om oppgaven har blitt kansellert, og hvis det har, gjøre noe opprydningsarbeid før du går ut. Dette kan omfatte avslutt filer eller databasetilkoblinger, utfylling eller rulle tilbake transaksjoner og avhending av ressurser. Det bør bemerkes at anmodende kansellering vil ikke påvirke en oppgave å stanse. Hvis du ignorerer en kansellering forespørsel oppgaven vil fortsette å gjennomføre inntil fullstendig eller inntil det kaster et unntak.

Vi kan se dette mønsteret i vår første eksempelet nedenfor. I hoved metoden skaper vi en CancellationTokenSource og bruke den til å få en token. Vi deretter passere denne token til vår Task konstruktør. I dette tilfellet lambda uttrykk som definerer Oppgave handlinger krever en separat fremgangsmåte. Dette er for å gjøre strukturen av oppgaven kansellering mønster lettere å se. Etter oppgaven har startet, vi venter for brukeren å trykke Enter, før den avbryter oppgaven ved å ringe CancellationTokenSource sin Avbryt metode. Dette forteller noen oppgaver som brukte sine tokens at de skal slutte å utføre.

DoLongRunningTask metoden kalles fra parallell oppgaven. Den simulerer en lang kjører prosessen ved looping hundre ganger og pause i ett sekund mellom hver iterasjon. Før løkken starter, er IsCancellationRequested eiendom token sjekket. Ettersom det er mulig at det kunne ha blitt kansellert før det hadde faktisk begynt å utføre, denne kontrollen gjør at den kan stoppes uten å utføre noe arbeid. Den IsCancellationRequested flagget er sjekket igjen i løpet av hver iterasjon. Hvis sant, vises en melding og loop utganger.

Prøv å kjøre kode og la noen iterasjoner for å fullføre før du trykker Enter for å avbryte oppgaven.

static void main ()

{

Var tokenSource = new CancellationTokenSource ();

Var token = tokenSource.Token;

Var oppgaven = new Task (() => DoLongRunningTask (token), token);

Console.WriteLine ("Trykk Enter for å avbryte");

task.Start ();

Console.ReadLine ();

tokenSource.Cancel ();

task.Wait ();

task.Dispose ();

Console.WriteLine ("Trykk Enter for å avslutte");

Console.ReadLine ();

}

static void DoLongRunningTask (CancellationToken token)

{

if (token.IsCancellationRequested)

{
< p> Console.WriteLine ("Avbrutt før lenge kjører oppgave i gang");

tilbake;

}

for (int i = 0; i <= 100; i ++)

{

Console.WriteLine ("{0}%" , i);

Thread.Sleep (1000);

if (token.IsCancellationRequested)

{

Console.WriteLine ("Avbrutt");

break;

}

}

} Anmeldelser



Previous:
Next Page: