2012-03-26 30 views
7

Tôi có một nhiệm vụ MSBuild tùy chỉnh cho xUnit.net. Khi nhiệm vụ đang chạy, nếu tôi nhấn Ctrl + C, nó 'cố gắng' để hủy bỏ nhiệm vụ, nhưng tất nhiên nó không thành công (vì nhiệm vụ của tôi không hỗ trợ hủy bỏ). Không có số lượng tìm kiếm tài liệu MSDN hoặc Google-fu đã hạ cánh trên một giải pháp. Vì tôi không thể tìm thấy một giao diện rõ ràng để triển khai, tôi đoán có thể việc hủy bỏ được hỗ trợ theo cách của một số quy ước.Làm thế nào để bạn viết một nhiệm vụ MSBuild để hỗ trợ hủy bỏ?

Có ai đã làm điều này trước đây và biết những gì cần thiết để hủy bỏ hoạt động không?

Trả lời

14

Nhiệm vụ của bạn cần thực hiện ICancelableTask. Đó là một giao diện rất đơn giản được thêm vào 4.0.

Về cơ bản, bạn chỉ cần thêm phương thức Cancel(). Nó phải sẵn sàng để được gọi trên một chủ đề khác, bất cứ lúc nào, và trở lại ngay lập tức. Nhiệm vụ của bạn sau đó phải trở về từ Thực thi ngay lập tức. Thông thường bạn sẽ đặt một cờ boolean bên trong Cancel(). Sau đó, bên trong nhiệm vụ của bạn, bạn thường sẽ có một vòng lặp xử lý từng đầu vào lần lượt - ví dụ, sao chép một tập tin này sang tập tin khác - và trong mỗi lần lặp lại, hãy kiểm tra cờ; nếu đó là sự thật, hãy thoát ra. Việc bạn trả về true hay false từ Execute trong ngữ cảnh này không quan trọng.

Nếu bạn bắt nguồn từ ToolTask ​​- nếu nhiệm vụ của bạn sinh ra một công cụ, bạn nên thực hiện điều này, vì nó tiết kiệm rất nhiều mã, xử lý việc ghi nhật ký không đồng bộ, và những thứ khác xử lý Hủy tự động. Khi Cancel xảy ra, nó sẽ giết chết công cụ mà nó sinh ra và tất cả các con của nó. Nhiệm vụ của nhóm C++ trong một số trường hợp sẽ ghi đè hành vi mặc định này, do đó trình biên dịch/trình liên kết của họ có vài giây để làm sạch các kết quả được viết một nửa trước khi trả về.

(Thông tin bên lề: khi tôi lần đầu tiên triển khai tính năng này trong MSBuild, tôi đã vô tình tạo VS màn hình xanh đôi khi hộp này. Phiên bản này gần như được phát hành trong phiên bản beta 10 nhưng được phát hiện đúng lúc. sai, và đôi khi sẽ giết một quá trình hệ thống. rất tiếc.)

Dan

+0

Tôi đoán lý do tôi chưa bao giờ thấy điều này là vì nó mới cho 4.0 và nhiệm vụ của tôi vẫn đang nhắm mục tiêu 2.0. Điều tốt cần biết, tuy nhiên, khi tôi nâng cấp lên 4.0 tôi có thể bắt đầu sử dụng điều này. Cảm ơn! –

+0

"logic để tìm ra cây quá trình là sai, và đôi khi sẽ giết chết một quá trình hệ thống. Rất tiếc." 1 để có thể tìm ra điều đó! Hahahaha! –

0

Tôi biết bạn cũng nhận thức được hệ thống phân cấp nhiệm vụ, nhưng trên offchance đây là những gì bạn đang tìm kiếm và nó chỉ là một thực tế rằng bạn không thực hiện một ToolTask ...

Inside MSBuild 2nd ed nói (p118) của ToolTask.Cancel

Phương pháp này được gọi để hủy thực hiện tác vụ. Khi phương thức này được gọi bởi MSBuild, nếu tác vụ không hoàn thành, nó sẽ bị chấm dứt hiệu lực

Không có tham chiếu nào khác để hủy bỏ trong đó.

+0

Vâng, tôi nhìn vào đó, nhưng tôi không chạy một công cụ bên ngoài, vì vậy ToolTask ​​là chắc chắn nhất không phải các bit bên phải của hệ thống phân cấp. Tôi cho rằng tôi có thể bổ sung một phương pháp giống như vậy và xem liệu MSBuild có gọi tôi không ... trước khi tôi đi lang thang trên con đường đó, tôi nghĩ tôi sẽ hỏi xem có ai đã từng làm điều đó không. –

+0

Cool, Ngón tay vượt qua. @Sayed Ibrahim Hashimi Đây là nơi bạn bước vào! .... –

+0

Trong cuốn sách, chúng tôi không có chỗ để trang trải. Chúng tôi có thể đang thực hiện cập nhật, trong trường hợp này tôi sẽ bao gồm thông tin này. –

Các vấn đề liên quan