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