Thursday 21 December 2017

प्रतीक्षाइन्क्सिट एसिंक्रोनि


मुझे यह प्रतीत होता है कि इस एसिंक्रनाइसी सिस्टम को एक समस्या का एक शानदार समाधान था, जहां मुझे बाहरी प्रक्रिया शुरू करने की आवश्यकता थी, और उसके बाद इसे पूरा करने की प्रतीक्षा की गई। वर्तमान में, मेरे पास UI थ्रेड पर निम्न कोड है: प्रक्रिया प्रक्रिया नई प्रक्रिया () प्रक्रिया। स्टार्ट () प्रक्रिया। VaitForExit () प्रक्रिया में कई सेकंड लगते हैं, लेकिन Ive पृष्ठभूमि कार्यकर्ता या समान का उपयोग करते हुए विरोध किया क्योंकि यह अक्सर अक्सर नहीं होता है पर्याप्त प्रयास और कोड-scrambling के लायक हो मैंने श्वेतपत्र में विस्तार विधियों का उल्लेख देखा है, लेकिन प्रक्रिया के लिए कोई एक्सटेंशन विधि नहीं हो रही है। RUNAsync () या ऐसा कुछ, quotAwait TaskEx. Run () छोड़कर gt प्रक्रिया.WaitForExit ()) एकमात्र समाधान है जो दिखता है जैसे यह काम करेगा एक अतिरिक्त धागा को स्पिनिंग करने के लिए बस WaitForExit को बेवकूफ लगता है। मुझे किसी भी स्थिर तरीके से नहीं मिला, जो किसी भी AsyncCtpExtensions, AsyncCtpThreadingExtensions, TaskEx, या TaskExtensions में आशाजनक दिखाई दिए। बाहरी प्रक्रिया को पूरा करने का इंतजार करने का एक बेहतर तरीका है (शुक्रवार, 2 9 अक्टूबर, 2018 6:35 PM) इस तरीके से पूल का उपयोग करने के लिए नकारात्मक पक्ष यह है कि आप प्रक्रिया की अवधि के लिए एक धागा को अवरुद्ध कर देंगे। यदि आप कई प्रक्रियाओं को कताई नहीं कर रहे हैं, यह एक बड़ी समस्या नहीं हो सकती, लेकिन अभी तक ऐसा करने की कोई वास्तविक आवश्यकता नहीं है। इसके बजाय, आप एक ऐसे कार्य का उपयोग कर सकते हैं जो थ्रेड तक सीमित नहीं हैं, उदा। सार्वजनिक स्थिर कार्य exitedAsync (इस प्रक्रिया पी) var टीसीएस नई कार्य समाप्ती Sourceltobjectgt () पी। एक्सक्स्ड 43 (एस, ई) gt tcs. TrySetResult (शून्य) अगर (पी। HaseExited) tcs. TrySetResult (रिक्त) वापसी टीसीएस। उस के साथ टास्क, आप लिख सकते हैं: और आप किसी भी थ्रेड्स को अवरुद्ध नहीं करेंगे, जबकि एसिंक्रोनस से बाहर निकलने की प्रक्रिया की प्रतीक्षा कर रहे हैं। स्टीफन टौब द्वारा जवाब के रूप में प्रस्तावित - MSFT माइक्रोसॉफ्ट के कर्मचारी, मॉडरेटर शुक्रवार, अक्टूबर 29, 2018 9:29 PM लुसियन विशिक्क, एमएसएफटी माइक्रोसॉफ्ट के कर्मचारी, स्वामी शनिवार, अक्टूबर 30, 2018 10:13 शुक्रवार, अक्टूबर 2 9, 2018 9:28 PM को एक अतिरिक्त थ्रेड को कताई के लिए बस WaitForExit को कॉल करने के लिए बेवकूफ लग रहा है। यदि आप मानक TPL कार्यक्षमता का उपयोग करते हैं, तो डिफ़ॉल्ट रूप से, यह थ्रेडपुल थ्रेड का उपयोग करेगा। वास्तव में धागा को ऊपर उठाने के लिए बहुत समय तक इंतजार नहीं करना चाहिए। चूंकि यह ऐसा कुछ है जो अक्सर प्रयास और कोड-स्क्रामबलिंगक्वॉट के मूल्य के बराबर नहीं होता है, आईडी का उपयोग करें: रीड कॉपोसी, जूनियर - रीडकॉपी यदि कोई पोस्ट आपके प्रश्न का उत्तर देती है, तो उस पद पर उद्धरण चिह्न के उत्तर को क्लिक करें और quot उपयोगी quot के रूप में चिह्नित करें शुक्रवार, 2 9, 2018 7:30 पूर्वाह्न पूल में इस तरह से उपयोग करने के लिए नकारात्मक पक्ष यह है कि आप प्रक्रिया की अवधि के लिए एक धागा को अवरुद्ध करेंगे। यदि आप कई प्रक्रियाओं को कताई नहीं कर रहे हैं, यह एक बड़ी समस्या नहीं हो सकती, लेकिन अभी तक ऐसा करने की कोई वास्तविक आवश्यकता नहीं है। इसके बजाय, आप एक ऐसे कार्य का उपयोग कर सकते हैं जो थ्रेड तक सीमित नहीं हैं, उदा। सार्वजनिक स्थिर कार्य exitedAsync (इस प्रक्रिया पी) var टीसीएस नई कार्य समाप्ती Sourceltobjectgt () पी। एक्सक्स्ड 43 (एस, ई) gt tcs. TrySetResult (शून्य) अगर (पी। HaseExited) tcs. TrySetResult (रिक्त) वापसी टीसीएस। उस के साथ टास्क, आप लिख सकते हैं: और आप किसी भी थ्रेड्स को अवरुद्ध नहीं करेंगे, जबकि एसिंक्रोनस से बाहर निकलने की प्रक्रिया की प्रतीक्षा कर रहे हैं। स्टीफन टौब द्वारा जवाब के रूप में प्रस्तावित - एमएसएफएफटी माइक्रोसॉफ्ट के कर्मचारी, मॉडरेटर शुक्रवार, 2 9 अक्टूबर, 2018 9:29 बजे लुसियन विशिक्क, एमएसएफटी माइक्रोसॉफ्ट के कर्मचारी, स्वामी शनिवार, अक्टूबर 30, 2018 10:13 शुक्रवार, अक्टूबर 2 9, 2018 9:28 अपराह्नप्रक्रिया। BeginOutputReadLine विधि () मानक आउटपुट स्ट्रीम सिंक्रोनस या एसिंक्रोनस रूप से पढ़ा जा सकता है पढ़ें जैसे तरीके पढ़ने के लिए लाइन। और ReadToEnd प्रक्रिया की आउटपुट स्ट्रीम पर तुल्यकालिक पढ़ने के कार्यों प्रदर्शन। ये सिंक्रोनस पठन ऑपरेशन तब तक पूरा नहीं करते जब तक कि संबद्ध प्रक्रिया उसके मानक आउटपुट स्ट्रीम पर लिखती नहीं है या स्ट्रीम को बंद कर देती है। इसके विपरीत, BeginOutputReadLine मानकऑटपुट स्ट्रीम पर अतुल्यकालिक पढ़ने वाले कार्यों को प्रारंभ करता है। यह विधि स्ट्रीम आउटपुट के लिए एक निर्दिष्ट ईवेंट हैंडलर को सक्षम करती है और तुरंत कॉलर को लौटा देती है, जो अन्य आउटपुट कर सकती है, जबकि स्ट्रीम आउटपुट को ईवेंट हैंडलर पर निर्देशित किया जाता है। किसी प्रक्रिया के लिए मानक आउटपुट पर असिंक्रोनस पढ़ने के कार्य करने के लिए इन चरणों का पालन करें। अपने ईवेंट हैंडलर को आउटपुट डेटा पुनर्प्राप्त ईवेंट में जोड़ें। ईवेंट हैंडलर को सिस्टम। डायग्नोस्टिक्स से मेल खाना चाहिए। डाटाराइसेवाइवेंटहैंडलर प्रतिनिधि हस्ताक्षर प्रक्रिया के लिए आरंभ करेंऑप्टपुटरेडलाइन कॉल करें यह कॉल मानकऑटपुट पर अतुल्यकालिक पढ़ने वाले कार्यों को प्रारंभ करता है जब असिंक्रोनस पठन कार्य प्रारंभ होता है, तो ईवेंट हैंडलर को प्रत्येक बार संबद्ध प्रक्रिया को इसकी मानक आउटपुट स्ट्रीम में पाठ की एक पंक्ति लिखता है। आप CancelOutputRead को कॉल करके एक अतुल्यकालिक पढ़ने के कार्य को रद्द कर सकते हैं। पढ़ने वाले ऑपरेशन को कॉलर द्वारा या ईवेंट हैंडलर द्वारा रद्द किया जा सकता है। रद्द करने के बाद, आप एसिंक्रोनस रीड ऑपरेशन को फिर से शुरू करने के लिए फिर से शुरू करें। आप रीडायरेक्ट स्ट्रीम पर असिंक्रोनस और सिंक्रोनस रीडेड ऑपरेशन को मिश्रित नहीं कर सकते। एक बार रीडायरेक्ट स्ट्रीम की प्रक्रिया को एसिंक्रोनस या सिंक्रोनस मोड में खोला जाता है, तो उस स्ट्रीम पर सभी आगे पढ़ा जाने वाला ऑपरेशन एक ही मोड में होना चाहिए। उदाहरण के लिए, StartOutputReadLine का पालन न करें StandardOutput स्ट्रीम पर रीडलाइन को कॉल करें, या इसके विपरीत। हालांकि, आप विभिन्न मोड में दो अलग-अलग धाराओं को पढ़ सकते हैं। उदाहरण के लिए, आप BeginOutputReadLine को कॉल कर सकते हैं और फिर StandardError स्ट्रीम के लिए रीडलाइन कॉल करें।

No comments:

Post a Comment