2012-03-26 12 views
7

Ho un compito MSBuild personalizzato per xUnit.net. Quando l'attività è in esecuzione, se premo Ctrl + C, "cerca" di annullare l'attività, ma ovviamente fallisce (poiché la mia attività non supporta l'annullamento). Nessuna quantità di ricerche di documenti MSDN o di Google-fu sono finite su una soluzione. Dal momento che non riesco a trovare un'interfaccia ovvia da implementare, suppongo che l'annullamento sia supportato da qualche convenzione.Come si scrive un'attività di MSBuild per supportare l'annullamento?

Qualcuno l'ha già fatto e sa cosa è necessario per far funzionare l'annullamento?

risposta

14

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

+0

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! –

+0

"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! –

0

So che sei ben consapevole della gerarchia di attività, ma per imbatterti questo è quello che stai cercando ed è solo il fatto che non sei l'attuazione di una ToolTask ...

Inside MSBuild 2nd ed dice (p118) di ToolTask.Cancel

Questo metodo viene chiamato per annullare l'esecuzione dell'attività. Una volta che questo metodo viene chiamato da MSBuild, se l'attività non viene completata, verrà terminata con forza

Non ci sono altri riferimenti alla cancellazione in esso.

+0

Sì, ho guardato, ma non pubblico uno strumento esterno, in modo da ToolTask ​​è sicuramente non il diritto po 'di gerarchia. Suppongo che potrei semplicemente completare un metodo che assomiglia a quello e vedere se MSBuild mi ha chiamato ... prima di vagare per quella strada, ho pensato di chiedere e vedere se qualcuno l'avesse mai fatto. –

+0

Fresco, con le dita incrociate. @Sayed Ibrahim Hashimi Questo è il punto in cui entri! .... –

+0

Nel libro non avevamo spazio per coprire questo. Potremmo fare un aggiornamento, nel qual caso includerò questo. –

Problemi correlati