Ваша задача должна реализовать ICancelableTask . Это очень простой интерфейс, добавленный в 4.0.
По сути, вы просто добавляете метод Cancel (). Он должен быть готов к вызову в другом потоке в любое время и быстро возвращаться. Ваша задача должна затем быстро вернуться из Выполнить. Обычно вы устанавливаете логический флаг внутри Cancel (). Тогда внутри вашей задачи у вас обычно будет цикл, обрабатывающий каждый вход по очереди - например, копирование одного файла за другим - и на каждой итерации проверяйте флаг; если это правда, вырваться. В этом контексте не имеет значения, возвращаете ли вы true или false из Execute.
Если вы наследуете ToolTask - если ваша задача порождает инструмент, настоятельно рекомендуется сделать это, так как он сохраняет много кода, обрабатывает асинхронное ведение журнала и другие вещи - тогда он уже обрабатывает Отменить автоматически. Когда происходит Отмена, он убивает созданный инструмент и всех его потомков. Задачи группы C ++ в некоторых случаях переопределяют это поведение по умолчанию, поэтому у их компилятора / компоновщика есть несколько секунд, чтобы очистить свои наполовину записанные выходные данные перед возвратом.
(Общая информация: когда я впервые реализовал это в MSBuild, я случайно сделал VS синим экраном окно иногда. Это почти поставляется в бета-версии VS10, но был обнаружен как раз вовремя. Синий экран был потому, что логика для расчета дерева процессов была неправильной , и иногда убивает системный процесс. Упс.)
Dan