Thursday 7 December 2017

Redirectstandarderror - waitforexit - सी #


मेरे पास निम्न कोड है: मुझे पता है कि जिस प्रक्रिया से मैं शुरू कर रहा हूँ वह उत्पादन लगभग 7 एमबी लंबा है इसे विंडोज कंसोल में चलाना ठीक काम करता है दुर्भाग्यवश प्रोग्रामेटिकल रूप से यह प्रतीक्षाफॉरएक्सिट पर अनिश्चित काल तक लटका हुआ है। नोट भी यह कोड छोटे आउटपुट (जैसे 3KB) के लिए लटका नहीं करता है क्या यह संभव है कि ProcessStartInfo कैंट बफर 7 एमबी में आंतरिक मानक आउटपुट यदि हां, तो मैं इसके बजाय क्या करना चाहिए यदि नहीं, तो मैं क्या कर रहा हूं गलत है समस्या यह है कि यदि आप StandardOutput और मानक को पुनर्निर्देशित करते हैंअरेरेअर आंतरिक बफर पूर्ण हो सकता है जो भी ऑर्डर आप उपयोग करते हैं, इसमें कोई समस्या हो सकती है: यदि आप मानक आउटपुट पढ़ने से पहले प्रक्रिया को बाहर निकलने के लिए प्रतीक्षा करते हैं, तो प्रक्रिया को इसे लिखने का प्रयास करने से रोक सकते हैं, इसलिए प्रक्रिया समाप्त नहीं होती। यदि आप ReadOf का उपयोग करते हुए मानक आउटपुट से पढ़ते हैं तो आपकी प्रक्रिया ब्लॉक हो सकती है अगर प्रक्रिया कभी भी मानकऑप्ट्यूप को बंद नहीं करती है (उदाहरण के लिए अगर यह कभी भी समाप्त नहीं होता है, या यह मानक ईर्रॉटर को लिखने को अवरुद्ध कर रहा है) यह समाधान यह सुनिश्चित करने के लिए एसिंक्रोनस रीड का उपयोग करता है कि बफर पूर्ण नहीं हो। किसी भी डेडलॉक से बचने के लिए और मानक आउटपुट और स्टैंडर्ड ईआरआर दोनों से सभी आउटपुट एकत्र करने के लिए आप यह कर सकते हैं: संपादित करें: टाइमआउट को संभालने के लिए नीचे दिए गए उत्तर देखें और ऑब्जेक्ट डिस्ज़ेस अपवाद अपवाद से बचें। Process. StandardOutput के लिए प्रलेख आपको अन्यथा प्रतीक्षा करने से पहले पढ़ने के लिए कहता है, आप डेडलॉक कर सकते हैं, नीचे स्निपेट की प्रतिलिपि बना सकते हैं: मार्क बेयर्स का जवाब उत्कृष्ट है, लेकिन मैं सिर्फ निम्नलिखित को जोड़ूंगा: OutputDataReceived और ErrorDataReceived प्रतिनिधियों को outputWaitHandle और errorWaitHandle से पहले हटा दिया जाना चाहिए निपटाए। अगर आउटपुट आउटपुट डेटा के लिए टाइमआउट खत्म हो गया है और फिर समाप्त हो जाता है, तो आउटपुटआइटहाण्डल और त्रुटिवाइटहैंडल वैरिएबल का निपटान करने के बाद पहुंचा जायेगा। (एफवाईआई मुझे इस चेतावनी को एक जवाब के रूप में जोड़ना था क्योंकि मैं उनके पद पर टिप्पणी नहीं कर सका।) हमारे पास यह समस्या भी है (या एक प्रकार)। निम्नलिखित को आज़माएं: 1) p. WaitForExit (nnnn) के लिए एक समय समाप्ति जोड़ें जहां nnnn मिलीसेकंड में है। 2) WaitForExit कॉल से पहले ReadToEnd कॉल को रखें। यह वही है जो हमने एमएस की सिफारिश की है। सिस्टीम। डायग्नोस्टिक्स। प्रोसेस स्टार्ट इन्फ़ोक्लास विधानसभा: सिस्टम। डीएल नामस्थान: सिस्टम। डायग्नोस्टिक्स सारांश प्रक्रिया शुरू करते समय उपयोग किए गए मानों का एक सेट निर्दिष्ट करता है। सी सिंटैक्स: सार्वजनिक सीलबंद श्रेणी प्रक्रिया स्टार्टइन्फो रिमार्क्स प्रोसेसस्टटाइन्फ़ो प्रोसेस घटक के साथ संयोजन में प्रयोग किया जाता है। जब आप प्रोसेस क्लास का इस्तेमाल करते हुए एक प्रक्रिया शुरू करते हैं, तो चलने की प्रक्रिया में संलग्न होने पर आपके पास उपलब्ध जानकारी के अलावा प्रक्रिया की प्रक्रिया हो सकती है। आपके द्वारा शुरू की जाने वाली प्रक्रिया के अधिक से अधिक नियंत्रण के लिए आप ProcessStartInfo वर्ग का उपयोग कर सकते हैं। आपको कम से कम ProcessStartInfo. FileName संपत्ति को सेट करना होगा, या तो मैन्युअल रूप से या कन्स्ट्रक्टर का उपयोग करना चाहिए। फ़ाइल नाम किसी भी आवेदन या दस्तावेज़ है। यहां एक दस्तावेज को किसी भी फाइल प्रकार के रूप में परिभाषित किया गया है जिसमें उसके साथ जुड़ी एक खुली या डिफ़ॉल्ट कार्यवाही है आप ऑपरेटिंग सिस्टम के माध्यम से उपलब्ध फ़ोल्डर विकल्प संवाद का उपयोग करके अपने कंप्यूटर के लिए पंजीकृत फ़ाइल प्रकार और उसके संबद्ध अनुप्रयोग देख सकते हैं। उन्नत बटन एक संवाद की ओर जाता है जो दिखाता है कि क्या एक विशिष्ट पंजीकृत फ़ाइल प्रकार से जुड़ी एक खुली क्रिया है। इसके अतिरिक्त, आप अन्य गुण सेट कर सकते हैं जो कि फाइल के साथ कार्रवाई करने के लिए परिभाषित करते हैं। आप System. Diagnostics. ProcessStartInfo. Verb (साझा स्रोत CLI) संपत्ति पर समर्थित नहीं करने के लिए ProcessStartInfo. FileName संपत्ति के प्रकार के लिए विशिष्ट मान निर्दिष्ट कर सकते हैं। उदाहरण के लिए, आप एक दस्तावेज़ प्रकार के लिए प्रिंट निर्दिष्ट कर सकते हैं। इसके अतिरिक्त, आप ProcessStartInfo. Arguments निर्दिष्ट कर सकते हैं गुणों को कमांड लाइन तर्क होने के लिए फ़ाइलों को खोलने के लिए प्रक्रिया खोलें। उदाहरण के लिए, यदि आप ProcessStartInfo. FileName प्रॉपर्टी में एक टेक्स्ट एडिटर एप्लिकेशन निर्दिष्ट करते हैं, तो आप संपादक द्वारा खोले जाने वाले टेक्स्ट फ़ाइल को निर्दिष्ट करने के लिए प्रोसेसस्टार्टइन्फो.अग्रेगमेंट प्रॉपर्टी का उपयोग कर सकते हैं। मानक इनपुट आमतौर पर कीबोर्ड है, और मानक आउटपुट और त्रुटि आमतौर पर मॉनिटर स्क्रीन होती है हालांकि, आप ProcessStartInfo. RedirectStandardInput का उपयोग कर सकते हैं ProcessStartInfo. RedirectStandardOutput और ProcessStartInfo. RedirectStandardError गुणों को इनपुट से इनपुट प्राप्त करने या किसी फ़ाइल या अन्य डिवाइस में आउटपुट वापस लाने के लिए कारण। यदि आप Process. StandardInput का उपयोग करते हैं Process. StandardOutput। या Process. StandardError गुण प्रोसेस घटक पर, आपको पहले प्रोसेसस्टार्टइन्फ़ो संपत्ति पर संबंधित मूल्य सेट करना होगा। अन्यथा, जब आप स्ट्रीम में पढ़ते या लिखते हैं तो सिस्टम एक अपवाद फेंकता है। ऑपरेटिंग सिस्टम शेल का उपयोग कर प्रक्रिया शुरू करने के लिए निर्दिष्ट करने के लिए ProcessStartInfo. UseShellExecute सेट करें। आप किसी भी ProcessStartInfo संपत्ति का मूल्य उस समय तक बदल सकते हैं, जब प्रक्रिया शुरू होती है। आप प्रक्रिया शुरू करने के बाद, इन मानों को बदलने से कोई प्रभाव नहीं पड़ता है। System. Diagnostics. ProcessStartInfo सदस्य सूची: डिफ़ॉल्ट कन्स्ट्रक्टर इस प्रकार के राज्य को शुरू करने के लिए इस निर्माता को व्युत्पन्न क्लास कन्स्ट्रक्टर द्वारा कहा जाता है। प्रक्रिया शुरू करने के लिए फ़ाइल नाम निर्दिष्ट किए बिना ProcessStartInfo वर्ग के एक नए इंस्टेंस को प्रारंभ करता है। ओवरलोड किया गया:.ctor (string fileName) प्रक्रिया की एक नई आवृत्ति को शुरू करता है ProcessStartInfo वर्ग और एक फ़ाइल नाम निर्दिष्ट करता है जैसे कोई अनुप्रयोग या दस्तावेज़ जिसके साथ प्रक्रिया शुरू होती है। ओवरलोडेड:.कॉरक्टर (स्ट्रिंग फाइलनाम, स्ट्रिंग आर्गुमेंट्स) प्रोसेस्टस्टार्टइनफ़ो वर्ग के एक नए इंस्टेंस को शुरू करता है और एक आवेदन फ़ाइल नाम निर्दिष्ट करता है जिसके साथ प्रक्रिया शुरू करने के साथ-साथ आवेदन को पास करने के लिए कमांड लाइन तर्कों का एक सेट भी होता है। गेट या अनुप्रयोग शुरू करते समय उपयोग करने के लिए कमांड लाइन तर्कों का सेट सेट करता है। फ़ाइलों के लिए खोज पथ, अस्थायी फ़ाइलों के लिए निर्देशिका, एप्लिकेशन-विशिष्ट विकल्प, और अन्य समान जानकारी मिलती है। System. Diagnostics. ProcessStartInfo सदस्य विवरण ओवरलोडेड सीटीओआर 1 सारांश प्रोसेसस्टार्टइन्फो क्लास के एक नए इंस्टेंस की शुरुआत के बिना फ़ाइल नाम निर्दिष्ट किए बिना प्रक्रिया शुरू करने के लिए। डिफ़ॉल्ट कन्स्ट्रक्टर इस प्रकार के राज्य को शुरू करने के लिए इस निर्माता को व्युत्पन्न क्लास कन्स्ट्रक्टर द्वारा कहा जाता है। सी सिंटैक्स: रिमार्क्स आपको प्रक्रिया शुरू करने से पहले कम से कम प्रोसेस्टस्टाईटफ़ाईनफाइल नाम की संपत्ति निर्धारित करनी होगी। फ़ाइल नाम किसी भी आवेदन या दस्तावेज़ है। इस स्थिति में, किसी दस्तावेज़ को किसी भी फाइल प्रकार के रूप में परिभाषित किया जाता है जिसमें उसके साथ जुड़ी एक खुली या डिफ़ॉल्ट कार्यवाही होती है आप ऑपरेटिंग सिस्टम के माध्यम से उपलब्ध फ़ोल्डर विकल्प संवाद का उपयोग करके अपने कंप्यूटर के लिए पंजीकृत फ़ाइल प्रकार और उसके संबद्ध अनुप्रयोग देख सकते हैं। उन्नत बटन एक संवाद की ओर जाता है जो दिखाता है कि क्या एक विशिष्ट पंजीकृत फ़ाइल प्रकार से जुड़ी एक खुली क्रिया है। वैकल्पिक रूप से, आप प्रक्रिया शुरू करने से पहले अन्य गुणों को भी सेट कर सकते हैं। System. Diagnostics. ProcessStartInfo. Verb (साझा स्रोत CLI पर समर्थित नहीं) संपत्ति की आपूर्ति कार्यों को ले जाने के लिए, जैसे कि प्रिंट, साथ में निर्दिष्ट फ़ाइल ProcessStartInfo. FileName गुण। ProcessStartInfo. Arguments संपत्ति फ़ाइल को कमांड लाइन तर्कों को पास करने के लिए एक तरीका प्रदान करती है जब सिस्टम इसे खोलता है। ओवरलोडेड सीटीओआर 2 सारांश प्रोसेस्टस्टाईटइनफ़ो वर्ग के एक नए इंस्टेंस को शुरू करता है और एक फाइल नाम निर्दिष्ट करता है जैसे कि कोई अनुप्रयोग या दस्तावेज़ जिसके साथ प्रक्रिया शुरू होती है। सी सिंटैक्स: एक आवेदन या दस्तावेज जिसमें एक प्रक्रिया शुरू होनी है। रिमार्क्स फ़ाइल नाम किसी भी आवेदन या दस्तावेज़ है। इस स्थिति में, किसी दस्तावेज़ को किसी भी फाइल प्रकार के रूप में परिभाषित किया जाता है जिसमें उसके साथ जुड़ी एक खुली या डिफ़ॉल्ट कार्यवाही होती है आप ऑपरेटिंग सिस्टम के माध्यम से उपलब्ध फ़ोल्डर विकल्प संवाद का उपयोग करके अपने कंप्यूटर के लिए पंजीकृत फ़ाइल प्रकार और उसके संबद्ध अनुप्रयोग देख सकते हैं। उन्नत बटन एक संवाद की ओर जाता है जो दिखाता है कि क्या एक विशिष्ट पंजीकृत फ़ाइल प्रकार से जुड़ी एक खुली क्रिया है। आप इस निर्माता को कॉल करने के बाद प्रोसेसस्टार्टइनफ़ोफाइलनाम की संपत्ति बदल सकते हैं, उस समय तक कि प्रक्रिया शुरू होती है। आप प्रक्रिया शुरू करने के बाद, इन मानों को बदलने से कोई प्रभाव नहीं पड़ता है। ओवरलोडेड सीटीओआर 3 सारांश प्रोसेस्टस्टटाइन्फ़ो क्लास का एक नया इंस्टेंस आरंभ करता है और एक आवेदन फ़ाइल नाम निर्दिष्ट करता है जिसके साथ प्रक्रिया शुरू करने के साथ-साथ आवेदन को पास करने के लिए कमांड लाइन तर्कों का एक सेट भी होता है। सी सिंटैक्स: एक आवेदन जिसमें एक प्रक्रिया शुरू करने के लिए। प्रक्रिया शुरू होने पर एप्लिकेशन को पास करने के लिए कमांड लाइन तर्क। रिमार्क्स फ़ाइल नाम किसी भी आवेदन या दस्तावेज़ है। इस स्थिति में, किसी दस्तावेज़ को किसी भी फाइल प्रकार के रूप में परिभाषित किया जाता है जिसमें उसके साथ जुड़ी एक खुली या डिफ़ॉल्ट कार्यवाही होती है आप ऑपरेटिंग सिस्टम के माध्यम से उपलब्ध फ़ोल्डर विकल्प संवाद का उपयोग करके अपने कंप्यूटर के लिए पंजीकृत फ़ाइल प्रकार और उसके संबद्ध अनुप्रयोग देख सकते हैं। उन्नत बटन एक संवाद की ओर जाता है जो दिखाता है कि क्या एक विशिष्ट पंजीकृत फ़ाइल प्रकार से जुड़ी एक खुली क्रिया है। आप इस निर्माता को कॉल करने के बाद प्रोसेसस्टार्टइनफ़ोफाइलनाम या प्रोसेस्टस्टाईट इन्फ़ो.अग्रिगमेंट्स गुणों को बदल सकते हैं, जिस समय तक प्रक्रिया शुरू होती है। आप प्रक्रिया शुरू करने के बाद, इन मानों को बदलने से कोई प्रभाव नहीं पड़ता है। संपत्ति: तर्क (पढ़ें-लिखना) सारांश गेट या अनुप्रयोग शुरू करते समय उपयोग करने के लिए कमांड लाइन तर्कों के सेट को सेट करता है। सी सिंटैक्स: सम्पत्ति: पर्यावरणविभिन्नता (केवल-पढ़ने के लिए) सारांश फाइलों, अस्थायी फ़ाइलों के लिए निर्देशिका, अनुप्रयोग-विशिष्ट विकल्प, और अन्य समान जानकारी के लिए खोज पथ हो जाता है। सी सिंटैक्स: प्रॉपर्टी: रीडायरेक्ट स्टैण्डर्ड एरर (रीड-लिट) सारांश प्रोसेसेस इंस्टेंस प्रोसेस। स्टैंडर्ड ईर्रॉयर सदस्य को प्रक्रिया त्रुटि त्रुटि को इंगित करता है या नहीं मान सेट करता है, स्टेंडर्ड एरर स्ट्रीम के अलावा किसी अन्य गंतव्य पर लिखने के लिए आपको सक्षम करता है (आमतौर पर मॉनिटर स्क्रीन)। किसी फ़ाइल या लॉग में त्रुटि डेटा लिखने के लिए उपयोग किया जाता है, उदाहरण के लिए। सी सिंटेक्स: रिमार्क्स प्रक्रिया घटक एक पाइप के माध्यम से एक बाल प्रक्रिया के साथ संचार करता है। यदि कोई बच्ची प्रक्रिया बफ़र को भरने के लिए पर्याप्त डेटा पाइप में लिखती है, तो बच्चे को तब तक अवरुद्ध कर दिया जाएगा जब तक कि माता-पिता पाइप से डेटा नहीं पढ़ते। यह डेडलॉक का कारण हो सकता है यदि आपका एप्लिकेशन मानक त्रुटि और मानक आउटपुट में सभी आउटपुट पढ़ रहा है, उदाहरण के लिए, निम्न C कोड का उपयोग कर। इस उदाहरण में, माता-पिता और बच्चे दोनों प्रक्रियाओं को अवरुद्ध कर दिया जाएगा, क्योंकि भरा हुआ पाइप बाल प्रक्रिया को पूरा करने से रोकता है, जबकि मूल प्रक्रिया को बाहर निकलने के लिए बच्चे की प्रक्रिया अनिश्चित काल तक प्रतीक्षा कर रही है। WaitForExit () से पहले ReadToEnd () को स्थानांतरित करके इस समस्या का समाधान किया जा सकता है। निम्नलिखित नुसार। एक समान समस्या उत्पन्न होती है, यदि आप दोनों मानक आउटपुट और मानक त्रुटि रीडायरेक्ट करते हैं और फिर दोनों को पढ़ने का प्रयास करते हैं, उदाहरण के लिए निम्न सी कोड का उपयोग कर। इस स्थिति में, अगर बाल प्रक्रिया मानक त्रुटि को कोई पाठ लिखती है तो यह प्रक्रिया को अवरुद्ध कर देगा, क्योंकि मूल प्रक्रिया मानक त्रुटि से पढ़ नहीं सकती है जब तक कि मानक आउटपुट से पढ़ना समाप्त नहीं हो जाता। हालांकि, प्रक्रिया समाप्त होने तक मूल प्रक्रिया मानक सिस्टम से नहीं पढ़ी जाएगी। इस स्थिति के लिए एक अनुशंसित समाधान दो धागे बनाने के लिए है ताकि आपका एप्लिकेशन एक अलग थ्रेड पर प्रत्येक स्ट्रीम का आउटपुट पढ़ सके। प्रॉपर्टी: रीडायरेक्ट स्टैंडर्ड इन्पुट (रीड-लिट) सारांश प्रक्रिया संकेत प्रक्रिया से प्रक्रिया कमांड इनपुट को पढ़ा जाता है या नहीं, यह दर्शाता है कि मानक इनपुट स्ट्रीम (आमतौर पर कुंजीपटल) के अलावा अन्य किसी स्रोत से पढ़ने के लिए आपको सक्षम मान या सेट करता है। फ़ाइल से डेटा पढ़ने के लिए उपयोग किया जाता है, उदाहरण के लिए। सी सिंटैक्स: प्रॉपर्टी: रीडायरेक्ट मानक ओटपुट (रीड-लिट) सारांश प्रोसेस इंस्टेंस प्रोसेस। स्टैन्डडऑन आउटपुट सदस्य को प्रक्रिया आउटपुट लिखा हुआ है या नहीं, यह इंगित करता है कि आपको एक मानक आउटपुट स्ट्रीम (आमतौर पर मॉनिटर स्क्रीन)। किसी फ़ाइल में डेटा लिखने के लिए उपयोग किया जाता है, उदाहरण के लिए। सी सिंटेक्स: रिमार्क्स प्रक्रिया घटक एक पाइप के माध्यम से एक बाल प्रक्रिया के साथ संचार करता है। यदि कोई बच्ची प्रक्रिया बफ़र को भरने के लिए पर्याप्त डेटा पाइप में लिखती है, तो बच्चे को तब तक अवरुद्ध कर दिया जाएगा जब तक कि माता-पिता पाइप से डेटा नहीं पढ़ते। यह डेडलॉक का कारण हो सकता है यदि आपका एप्लिकेशन मानक त्रुटि और मानक आउटपुट में सभी आउटपुट पढ़ रहा है, उदाहरण के लिए, निम्न C कोड का उपयोग कर। इस उदाहरण में, माता-पिता और बच्चे दोनों प्रक्रियाओं को अवरुद्ध कर दिया जाएगा, क्योंकि भरा हुआ पाइप बाल प्रक्रिया को पूरा करने से रोकता है, जबकि मूल प्रक्रिया को बाहर निकलने के लिए बच्चे की प्रक्रिया अनिश्चित काल तक प्रतीक्षा कर रही है। WaitForExit () से पहले ReadToEnd () को स्थानांतरित करके इस समस्या का समाधान किया जा सकता है। निम्नलिखित नुसार। एक समान समस्या उत्पन्न होती है, यदि आप दोनों मानक आउटपुट और मानक त्रुटि रीडायरेक्ट करते हैं और फिर दोनों को पढ़ने का प्रयास करते हैं, उदाहरण के लिए निम्न सी कोड का उपयोग कर। इस स्थिति में, अगर बाल प्रक्रिया मानक त्रुटि को कोई पाठ लिखती है तो यह प्रक्रिया को अवरुद्ध कर देगा, क्योंकि मूल प्रक्रिया मानक त्रुटि से पढ़ नहीं सकती है जब तक कि मानक आउटपुट से पढ़ना समाप्त नहीं हो जाता। हालांकि, प्रक्रिया समाप्त होने तक मूल प्रक्रिया मानक सिस्टम से नहीं पढ़ी जाएगी। इस स्थिति के लिए एक अनुशंसित समाधान दो धागे बनाने के लिए है ताकि आपका एप्लिकेशन एक अलग थ्रेड पर प्रत्येक स्ट्रीम का आउटपुट पढ़ सके। प्रॉपर्टी: UseShellExecute (पठन-लिखित) सारांश प्रक्रिया को प्रारंभ करने के लिए ऑपरेटिंग सिस्टम शेल का उपयोग करने के लिए इंगित करता है कि क्या कोई मान हो या निर्धारित करता है। सी सिंटैक्स: इस संपत्ति को झूठा बनाने के लिए टिप्पणी आपको इनपुट, आउटपुट, और त्रुटि स्ट्रीम को रीडायरेक्ट करने में सक्षम बनाता है। जब आप प्रक्रियाओं को प्रारंभ करने के लिए ऑपरेटिंग सिस्टम शेल का उपयोग करते हैं, तो आप किसी भी दस्तावेज़ को शुरू करने में सक्षम होते हैं (जो किसी निष्पादन योग्य से जुड़ी कोई भी पंजीकृत फ़ाइल प्रकार होती है जिसमें एक डिफ़ॉल्ट खुली कार्रवाई होती है) और फ़ाइल पर कार्य, जैसे मुद्रण, प्रक्रिया के साथ घटक। जब ProcessStartInfo. UseShellExecute गलत है आप प्रक्रिया घटक के साथ केवल निष्पादनयोग्य शुरू करने में सक्षम हैं। प्रॉपर्टी: वर्किंग डायरेक्टरी (पठन-लिट) सारांश आरंभ करने की प्रक्रिया के लिए प्रारंभिक निर्देशिका सेट हो जाती है या सेट करता है सी सिंटेक्स: रिमार्क्स यदि निर्देशिका पहले से ही सिस्टम पथ चर का हिस्सा है, तो इस संपत्ति में निर्देशिका स्थान को दोहराने के लिए आवश्यक नहीं है।

No comments:

Post a Comment