L'attività deve implementare ICancelableTask. È un'interfaccia molto semplice aggiunta in 4.0.
Fondamentalmente è sufficiente aggiungere un metodo Cancel(). Deve essere pronto per essere chiamato su un thread diverso, in qualsiasi momento, e restituire immediatamente. Il tuo compito deve quindi tornare immediatamente da Execute. In genere si imposta una bandiera booleana all'interno di Annulla(). Quindi all'interno del tuo task avresti in genere un ciclo che elabora ogni input a turno - per esempio, copiando un file dopo l'altro - e in ogni iterazione, controlla il flag; se è vero, scoppia. Non importa se si restituisce true o false da Execute in questo contesto.
Se si sta derivando da ToolTask, se il proprio compito genera uno strumento, si consiglia vivamente di farlo, poiché salva una grande quantità di codice, gestisce la registrazione asincrona e altre cose - quindi già gestisce Annulla automaticamente. Quando Annulla accade, uccide lo strumento generato e tutti i suoi figli. Le attività del team di C++ in alcuni casi sovrascrivono questo comportamento predefinito, in modo che il compilatore/linker disponga di alcuni secondi per ripulire le uscite semigrafiche prima di tornare.
(Curiosità: quando l'ho implementato per la prima volta in MSBuild, ho fatto casualmente VS di bluescreen la scatola di tanto in tanto.Questo quasi spedito in VS10 beta ma è stato scoperto appena in tempo.Il bluescreen era perché la logica per capire l'albero del processo era sbagliato, e sarebbe a volte uccidere un processo di sistema. Ops.)
Dan
fonte
2012-04-01 20:10:01
Sto indovinando il motivo per cui non ho mai visto questo perché è nuovo per 4.0 e le mie attività sono ancora rivolte al 2.0. Buono a sapersi, però, che quando aggiorno a 4.0 posso iniziare a usarlo. Grazie! –
"la logica per capire l'albero del processo era sbagliata e qualche volta avrebbe ucciso un processo di sistema." +1 per essere in grado di capirlo! Hahahaha! –