2012-03-26 18 views
7

Mam niestandardowe zadanie MSBuild dla xUnit.net. Kiedy zadanie jest uruchomione, jeśli kliknę Ctrl + C, "spróbuje" anulować zadanie, ale oczywiście nie powiedzie się (ponieważ moje zadanie nie obsługuje anulowania). Żadna liczba wyszukiwań dokumentów MSDN ani Google-fu nie znalazła rozwiązania. Ponieważ nie mogę znaleźć oczywistego interfejsu do implementacji, domyślam się, że anulowanie jest wspierane przez pewną konwencję.Jak napisać zadanie MSBuild do obsługi anulowania?

Ktoś zrobił to wcześniej i wie, co jest wymagane, aby anulować pracę?

Odpowiedz

14

Twoje zadanie wymaga wdrożenia ICancelableTask. To bardzo prosty interfejs dodany w wersji 4.0.

Zasadniczo wystarczy dodać metodę Anuluj(). Musi być gotowy do wezwania w innym temacie, w dowolnym momencie i szybko wrócić. Twoje zadanie musi natychmiast powrócić z egzekucji. Zwykle ustawisz flagę logiczną wewnątrz Cancel(). Następnie wewnątrz twojego zadania zwykle masz pętlę przetwarzającą kolejno każde wejście - na przykład kopiowanie jednego pliku po drugim - i w każdej iteracji sprawdź flagę; jeśli to prawda, wybuchnij. Nie ma znaczenia, czy w tym kontekście zwracana jest wartość true lub false z Execute.

Jeśli wywodzi się z ToolTask ​​- jeśli twoje zadanie spawnuje narzędzie, bardzo zalecane jest, abyś to zrobił, ponieważ zapisuje dużą ilość kodu, obsługuje rejestrowanie asynchroniczne i inne rzeczy - wtedy to już uchwyty Anuluj automatycznie. Kiedy anuluje się, zabija narzędzie, które zostało zarodkowane i wszystkie jego dzieci. Zadania zespołu C++ w niektórych przypadkach zastępują to domyślne zachowanie, więc ich kompilator/linker ma kilka sekund na wyczyszczenie wypisanych na pół wyników przed powrotem.

(Ciekawostka: kiedy po raz pierwszy zaimplementowałem to w MSBuild, przez przypadek wykonałem od czasu do czasu skrzynkę VS bluescreen, która prawie została dostarczona w wersji beta VS10, ale została odkryta w samą porę, ponieważ bluescreen był spowodowany logiką do odgadnięcia drzewa procesu. źle, a czasami zabić proces systemowy. Ups.)

Dan

+0

Zgaduję, dlaczego nigdy nie widziałem, że tak jest, ponieważ jest nowy dla wersji 4.0, a moje zadania nadal są ukierunkowane na 2.0. Dobrze wiedzieć, że po aktualizacji do wersji 4.0 mogę zacząć z tego korzystać. Dzięki! –

+0

"Logika do wykrycia drzewa procesu była błędna i czasami zabijała proces systemowy." "Ups." +1 za to, że potrafisz to rozgryźć! Hahahaha! –

0

wiem, że jesteś świadom hierarchii zadań, ale na offchance jest to, czego szukasz, a to jest po prostu fakt, że nie jesteś wdrożenie ToolTask ...

Inside MSBuild 2nd ed mówi (p118) z ToolTask.Cancel

Ta metoda jest wywoływana, aby anulować wykonanie zadania. Po wywołaniu tej metody przez MSBuild, jeśli zadanie nie zostanie zakończone, zostanie skutecznie usunięte.

Nie ma innych odniesień do anulowania w nim.

+0

tak, patrzyłem na to, ale ja nie uciekam zewnętrznego narzędzia, tak ToolTask ​​jest zdecydowanie nie w porządku trochę hierarchii. Przypuszczam, że mógłbym tylko uzupełnić metodę, która wygląda tak i zobaczyć, czy MSBuild zadzwonił do mnie ... zanim jednak powędrowałem tą ścieżką, pomyślałem, że zapytam i zobaczę, czy ktokolwiek to zrobił. –

+0

Fajnie, skrzyżowane palce. @ Sayed Ibrahim Hashimi Tutaj właśnie wkraczasz! .... –

+0

W książce nie było miejsca na pokrycie tego. Możliwe, że robimy aktualizację, w takim przypadku uwzględnię to. –