Как вы пишете задачу MSBuild для поддержки отмены? - PullRequest
8 голосов
/ 26 марта 2012

У меня есть пользовательская задача MSBuild для xUnit.net.Когда задача выполняется, если я нажимаю Ctrl + C, она «пытается» отменить задачу, но, конечно, она не выполняется (поскольку моя задача не поддерживает отмену).Никакое количество поисков документов MSDN или Google-fu не нашли решения.Так как я не могу найти очевидный интерфейс для реализации, я предполагаю, что, возможно, отмена поддерживается по какому-то соглашению.

Кто-нибудь делал это раньше и знает, что требуется, чтобы заставить работать отмена?

Ответы [ 2 ]

15 голосов
/ 02 апреля 2012

Ваша задача должна реализовать ICancelableTask . Это очень простой интерфейс, добавленный в 4.0.

По сути, вы просто добавляете метод Cancel (). Он должен быть готов к вызову в другом потоке в любое время и быстро возвращаться. Ваша задача должна затем быстро вернуться из Выполнить. Обычно вы устанавливаете логический флаг внутри Cancel (). Тогда внутри вашей задачи у вас обычно будет цикл, обрабатывающий каждый вход по очереди - например, копирование одного файла за другим - и на каждой итерации проверяйте флаг; если это правда, вырваться. В этом контексте не имеет значения, возвращаете ли вы true или false из Execute.

Если вы наследуете ToolTask ​​- если ваша задача порождает инструмент, настоятельно рекомендуется сделать это, так как он сохраняет много кода, обрабатывает асинхронное ведение журнала и другие вещи - тогда он уже обрабатывает Отменить автоматически. Когда происходит Отмена, он убивает созданный инструмент и всех его потомков. Задачи группы C ++ в некоторых случаях переопределяют это поведение по умолчанию, поэтому у их компилятора / компоновщика есть несколько секунд, чтобы очистить свои наполовину записанные выходные данные перед возвратом.

(Общая информация: когда я впервые реализовал это в MSBuild, я случайно сделал VS синим экраном окно иногда. Это почти поставляется в бета-версии VS10, но был обнаружен как раз вовремя. Синий экран был потому, что логика для расчета дерева процессов была неправильной , и иногда убивает системный процесс. Упс.)

Dan

0 голосов
/ 26 марта 2012

Я знаю, что вы хорошо знаете иерархию Задач, но в действительности это то, что вы ищете, и это просто тот факт, что вы не реализуете ToolTask ...

Внутри MSBuild 2-е изд. говорит (p118) о ToolTask.Cancel

Этот метод вызывается для отмены выполнения задачи. Если MSBuild вызывает этот метод, если задание не выполнено, оно будет принудительно завершено

В нем нет других ссылок на отмену.

...