2012-03-26 15 views
7

मेरे पास xUnit.net के लिए एक कस्टम MSBuild कार्य है। जब कार्य चल रहा है, यदि मैं Ctrl + C दबाता हूं, तो यह कार्य को रद्द करने का प्रयास करता है, लेकिन निश्चित रूप से यह विफल रहता है (क्योंकि मेरा कार्य रद्द करने का समर्थन नहीं करता है)। एमएसडीएन दस्तावेज़ खोज या Google-fu की कोई भी मात्रा समाधान पर उतरा नहीं है। चूंकि मुझे लागू करने के लिए एक स्पष्ट इंटरफ़ेस नहीं मिल रहा है, इसलिए मुझे लगता है कि कुछ सम्मेलन के माध्यम से रद्द करने का समर्थन किया जा सकता है।रद्द करने का समर्थन करने के लिए आप एक एमएसबिल्ड कार्य कैसे लिखते हैं?

क्या किसी ने पहले यह किया है, और जानता है कि काम करने के लिए रद्द करने के लिए क्या आवश्यक है?

उत्तर

14

आपके कार्य को ICancelableTask लागू करने की आवश्यकता है। यह 4.0 में जोड़ा गया एक बहुत ही सरल इंटरफ़ेस है।

मूल रूप से आप केवल एक रद्द() विधि जोड़ते हैं। यह किसी भी समय, एक अलग धागे पर बुलाए जाने के लिए तैयार होना चाहिए, और तुरंत लौट जाना चाहिए। तब आपका कार्य तत्काल निष्पादन से वापस आना चाहिए। आमतौर पर आप रद्द() के अंदर एक बुलियन ध्वज सेट करेंगे। फिर आपके कार्य के अंदर आप आमतौर पर प्रत्येक इनपुट को एक इनपुट में बदलते हैं - उदाहरण के लिए, एक फ़ाइल को दूसरे के बाद कॉपी करना - और प्रत्येक पुनरावृत्ति में, ध्वज की जांच करें; यदि यह सच है, तोड़ो। इससे कोई फर्क नहीं पड़ता कि आप इस संदर्भ में निष्पादन से सच या गलत लौटते हैं या नहीं।

यदि आप टूलटास्क से प्राप्त कर रहे हैं - यदि आपका कार्य किसी टूल को फैलाता है, तो यह बहुत दृढ़ता से अनुशंसा की जाती है कि आप ऐसा करते हैं, क्योंकि यह कोड का एक बड़ा सौदा बचाता है, एसिंक लॉगिंग को संभाला जाता है, और अन्य चीजें - तो यह पहले से ही है हैंडल स्वचालित रूप से रद्द करें। जब रद्द होता है, तो यह उस उपकरण को मार देता है जो उसके पैदा हुए और उसके सभी बच्चे होते हैं। कुछ मामलों में सी ++ टीम के कार्य इस डिफ़ॉल्ट व्यवहार को ओवरराइड करते हैं, ताकि उनके कंपाइलर/लिंकर के पास लौटने से पहले उनके अर्ध-लिखित आउटपुट को साफ करने के लिए कुछ सेकंड हों।

(ट्रिविया: जब मैंने इसे पहली बार एमएसबिल्ड में कार्यान्वित किया, तो मैंने गलती से कभी-कभी बॉक्स को वीएस ब्लूस्क्रीन बनाया। यह लगभग वीएस 10 बीटा में भेज दिया गया था, लेकिन समय पर ही खोजा गया था। ब्लूस्क्रीन इसलिए थी क्योंकि प्रक्रिया पेड़ को समझने के लिए तर्क था गलत, और कभी कभी एक प्रणाली प्रक्रिया को मार डालेंगे। उफ़।)

दान

+0

मैं अनुमान लगा रहा हूं कि मैंने ऐसा कभी नहीं देखा क्योंकि यह 4.0 के लिए नया है, और मेरे कार्य अभी भी 2.0 को लक्षित कर रहे हैं। जानना अच्छा है, हालांकि, जब मैं 4.0 तक अपग्रेड करता हूं तो मैं इसका उपयोग शुरू कर सकता हूं। धन्यवाद! –

+0

"प्रक्रिया पेड़ को समझने के लिए तर्क गलत था, और कभी-कभी सिस्टम प्रक्रिया को मार डालेगा। ओह।" इसे समझने में सक्षम होने के लिए +1! हा हा हा हा! –

0

मुझे पता है तुम टास्क पदानुक्रम से अच्छी तरह परिचित हैं, लेकिन offchance पर यह आपके लिए क्या देख रहे है और यह सिर्फ सच है कि आप लागू नहीं कर रहे हैं कि एक ToolTask ...

Inside MSBuild 2nd ed कहते है (पी 118) ToolTask.Cancel

इस विधि को कार्य निष्पादन को रद्द करने के लिए कहा जाता है। एक बार एमएसबिल्ड द्वारा इस विधि को बुलाया जाता है, यदि कार्य पूरा नहीं होता है, तो इसे मजबूती से

इसमें रद्दीकरण के लिए कोई अन्य संदर्भ नहीं हैं।

+0

हाँ, मुझे लगता है कि देखा, लेकिन मैं एक बाहरी उपकरण नहीं चल रहा हूँ, इसलिए ToolTask ​​सबसे निश्चित रूप से पदानुक्रम के सही सा नहीं है। मुझे लगता है कि मैं बस उस तरह की एक विधि का पूरक हो सकता हूं जो देखता है और देखता है कि क्या एमएसबिल्ड ने मुझे बुलाया था ... इससे पहले कि मैंने उस रास्ते को भटक ​​दिया, हालांकि, मुझे लगा कि मैं पूछूंगा और देख सकता हूं कि किसी ने कभी ऐसा किया है या नहीं। –

+0

कूल, फिंगर्स पार हो गया। @ सैयद इब्राहिम हाशिमी यह वह जगह है जहां आप कदम रखते हैं! .... –

+0

पुस्तक में हमारे पास इसे कवर करने की जगह नहीं थी। हम एक अद्यतन कर रहे हैं, इस मामले में मैं इसे शामिल करूंगा। –

संबंधित मुद्दे

 संबंधित मुद्दे