في انتظار عملية مع مهلة في.
على نفس المنوال من آخر مشاركة، قد نرغب في أن نكون أكثر ذكاء حول إطلاق عملية وانتظار خروجها.
خاصة إذا كانت هذه العملية جزءا من نظام حاسم مثل عملية البناء الخاص بك، كنت لا تريد عملية معلقة لتكون قادرة على التسبب بكامل نظام البناء لوقف القتلى في انها المسارات.
لحسن الحظ، عملية لديها زيادة في الوزن من ويتفوريكسيت الذي يأخذ مهلة عدد صحيح، وإرجاع منطقية - صحيح إذا كانت العملية خرجت، أو خطأ إذا لم العملية.
باستخدام هذه الوظيفة، يمكننا كتابة طريقة مثل هذا:
في هذا المقتطف، أوتباتداتاريسيفد هو الحدث الذي ينطلق عندما عملية يكتب البيانات إلى الإخراج القياسية، وإشارات بيجينأوتوبترادلين إلى أننا قد أعدنا الحدث ونحن على استعداد لبدء الاستماع لإخراج العملية.
استخدام نموذج الحدث في هذه الحالة يعني أننا لسنا بحاجة إلى أن يكون النص الناتج عملية كاملة في الذاكرة في أي نقطة واحدة في الوقت المناسب. كما يكتب عملية خط من النص، سيكون لدينا فقط هذا الخط في الذاكرة، وسوف تحصل جمع القمامة بعد أن نقوم بتحديث العداد لدينا.
هناك اثنين "غوتشا" في هذا المقتطف، على الرغم من.
الأول هو process. Kill (). هذا هو حالة السباق الكلاسيكي - بين الوقت يعود عملية لدينا من process. WaitForExit () ويستدعاء process. Kill ()، يمكن أن عملية الهدف الخروج. في هذه الحالة، تنص مسن أنه إذا استدعاء. Kill () على العملية التي خرجت بالفعل، سوف تحصل على إنفاليدوبيراتيونكسيبتيون.
يمكننا إصلاح هذا من خلال التعامل مع الاستثناء، مثل ذلك:
و "غوتشا" الثاني هو دقيق جدا، وربما كنت لن تجد ذلك حتى وظيفة لا يعود النتيجة التي تتوقعها، أو حتى تجلس وقراءة صفحة الوثائق بأكملها ل Process. WaitForExit (إنت). وتذكر شبكة مدسن أنه:
عند إعادة توجيه الإخراج القياسي إلى معالجات أحداث غير متزامنة، فمن الممكن أن معالجة الإخراج لم تكتمل عند إرجاع هذه الطريقة. لضمان اكتمال معالجة الحدث غير المتزامن استدعاء الزائد ويتفوريكسيت () الذي لا يأخذ أي معلمة بعد تلقي صحيح من هذا التحميل الزائد.
في هذه الحالة، فمن الممكن لوظيفتنا جيتنوموتبوتشارز لإرجاع قيمة تحتوي على أحرف أقل من إخراج العملية الفعلية، ما لم نسميه ويتفوريكسيت () مرة أخرى.
ومع أخذ ذلك في الاعتبار، تبدو وظيفتنا الآمنة النهائية الآن كما يلي:
أوتبوتداتيفيسد بعد ويتفوريكسيت
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
كيفية الانتظار لتيارات الإخراج عند استخدام process. WaitForExit مع مهلة الثابت.
وقد كان هذا النوع من "البحث الجنائي" مع نتائج مثيرة للدهشة للغاية - على الأقل بالنسبة لي.
نحن نقوم بتشغيل الأوامر الخارجية باستخدام كائن بروسيس. نحن التقاط الانتاج القياسية (والخطأ القياسية - لقد أزلت هذا من العينة لأسباب وضوح) بشكل غير متزامن. وقد تم الرد على هذا عدة مرات هنا. رمز يشبه هذا ويعمل بشكل جيد:
الآن، ماذا لو أردت إضافة مهلة صعبة إلى ويتفوريكسيت ()؟ سهلة: هناك نسخة مثقلة من ويتفوريكسيت (ميلي ثانية). لذا يجب أن تقوم مثل هذه الدعوة بما يلي:
الآن، وهذا يجعل التقاط الإخراج غير مكتملة في بعض الحالات.
هذا ليس سرا، على الأقل ليس لمطوري مايكروسوفت. بعد عدة ساعات من البحث، جئت إلى استنتاج مفاده أن شيئا ما يجب أن يكون خطأ في تنفيذ ويتفوريكسيت ل. لذلك أخذت نظرة على التعليمات البرمجية ووجدت هذا التعليق في تنفيذ مايكروسوفت:
وهنا سؤالي - ولقد فعلت بعض الجهد من التقييم دون نجاح:
كيف يمكن أن يكون مهلة صعبة على ويتفوريكسيت () وفي الوقت نفسه تأكد من أن التقاط الإخراج وحدة التحكم كاملة؟
هل حاولت استخدام الحدث أونكسيتد في فئة مشتقة؟ انظر الى هذا. قد يسمح لك ذلك باستخدام مهلة الانتظار بنفسك بدلا من تمريرها إلى ويتفوريكسيت.
Hans باسانت تعليقك موجه لي في الاتجاه الصحيح. في الواقع، أنا لا أعرف حقا كم من الوقت للنوم (). ولكن يمكنني إضافة كلب ساعة بسيطة لهذا الغرض. منذ أن تم الانتهاء من العملية بالفعل بحلول الوقت الذي يجب أن تبدأ في انتظار التقاطات المفقودة، يمكن أن نفترض أن الحدث أوتبوتداتاريسيتد يتم تشغيلها بشكل مستمر حتى تيار فارغ. لذلك كل ما فعلته كان إضافة ساعة توقيت وإعادة تشغيله في كل مرة في بداية طريقة الحدث أوتبوتداتاريسيتد. في التعليمات البرمجية الرئيسية، استبدال المكالمة إلى ويتفوريكسيت (60000) بواسطة التعليمات البرمجية التالية:
أوتبوتداتيفيسد بعد ويتفوريكسيت
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
كيفية قراءة لإنهاء عملية إخراج غير متزامن في C #؟
لدي مشكلة مع قراءة إخراج عملية واحدة بشكل غير متزامن في C #. لقد وجدت بعض الأسئلة الأخرى المماثلة على هذا الموقع لكنها لا تساعدني حقا. هنا هو ما أفعله:
جعل عملية جديدة تعيين ستارتينفو - FileName، وسيطات، كريتينويندو (ترو)، وسشليكسكيوت (فالس)، ريديركتستانداردوتوتبوت (ترو) إضافة معالج الأحداث إلى أوتبوتداتاريفسيف؛ بدء العملية، بيجينأوتوبترادلين ثم ويتفوريكسيت ().
أنه يعمل بشكل جيد ولكن إخراج عملية بدأت يكتب بعض النسب المئوية (٪) التي أريد الحصول عليها ولكن لا أستطيع منذ رمز بلدي يقرأ سطرا سطرا والنسب المئوية لا تظهر.
إليك الرمز الحالي لبرنامجي:
يبدو أن إخراج تيار القراءة بشكل غير متزامن هو كسر قليلا - لا يتم قراءة كافة البيانات قبل خروج العملية. حتى إذا قمت بالاتصال ب process. WaitForExit () وحتى إذا قمت بالاتصال ثم process. Close () (أو ديسبوس ()) لا يزال بإمكانك الحصول على الكثير من البيانات بعد ذلك. انظر alabaxblog. info/2018/06/redirectstandardoutput-beginoutputreadline-pattern-broken/ للحصول على كتابة كاملة، ولكن الحل هو أساسا لاستخدام أساليب متزامنة. لتجنب الجمود، على الرغم من، لديك لاستدعاء واحد منهم على مؤشر ترابط آخر:
بروسيس. ويتفوركسيت () سوف تنتظر حتى الانتهاء غير متزامن الناتج / خطأ تيار القراءة. لسوء الحظ هذا ليس صحيحا ل process. WaitForExit (المهلة) الزائد. هذا هو ما تقوم به فئة العمليات داخليا:
. لذلك سوف ننتظر للقراءة غير متزامن فقط إذا لم يكن هناك مهلة! لإصلاحه ببساطة استدعاء ويتفوريكسيت بارامتريليس () بعد ويتفوريكسيت (مهلة) عاد صحيح:
هناك عدد قليل من الأشياء التي تحصل في طريقها. قد يكون التطبيق وحدة التحكم باستخدام "باكباس" باكسباس الكتابة فوق النسبة المئوية، وربما لا بيغ إلى تيار ستدوت بعد كل الكتابة، و بيجينوتبترادلين ويفترض ينتظر لنهاية السطر قبل إعطائك البيانات.
الإرث المتعدد.
مشتقة من الكثير من الاشياء.
عملية أوسينك أوتبوتداتاريسيفد / إرورداتاريسيفد لديه عيب عند التعامل مع المطالبات.
System. Diagnostics. Process الدرجة - الجزء 2.
في الجزء 1 ناقشت المسألة عند استخدام ستدوت / ستدير إعادة توجيه وقراءتها بشكل متزامن، المخزن المؤقت الإخراج يمكن أن تصبح كاملة ومنع عملية الطفل على التالي "الكتابة". ثم يحدث توقف تام لأن العملية الأصل ينتظر على الطفل للخروج قبل قراءة البيانات من المخزن المؤقت، يتم حظر الطفل على الكتابة لأن المخزن المؤقت هو الكامل، وبالتالي الجمود. الجواب بسيط & # 8211؛ من الأفضل استخدام طريقة غير متزامن من قراءة البيانات من ستدوت / ستدر. هذه القضية هي المتوقعة وكان بلدي سيئة.
لست أنا بل أنت.
لقد واجهت مشكلة أخرى، والتي تبدو وكأنها نفس الجمود، واحد حيث افتراض سيئة في تنفيذ فئة عملية مايكروسوفت تسبب في نوع مختلف من الجمود بين العمليات الأم والطفل. لقد وجدت ذلك عندما دفعتني عملية طفلي إلى تأكيد النشاط المطلوب، انظر الشكل 1 للحصول على مثال.
انتهى موجه بدون خط جديد، وترك المؤشر في نهاية موجه (الذي هو منطقي، لماذا سيتم وضع المؤشر تحت المطالبة وليس بجانبه على الشاشة). انظر الشكل 2 على سبيل المثال رمز هذه المطالبة.
تم ترميز عملية ولي الأمر لتفقد البيانات ستدوت تلقى بشكل غير متزامن، وتبحث عن موجه. إذا / عندما تم استلام موجه، فإن العملية الأم تنبعث ردا على ستدين عملية الطفل. انظر الشكل 3.
ومع ذلك عندما قمت بتشغيل العملية الأم وعملية الطفل أرسلت موجه، النص لم يأت في الحدث أوتبوتداتاريسيتد ... وجلست العملية الأم على p. WaitForExit () خط إلى الأبد ... وكانت عملية الطفل في انتظار رد الذي لم يأت من الوالد، وكنا مرة أخرى في طريق مسدود، وهذه المرة أنا لم يكن لي .... المشكلة ليست في بلدي التعليمات البرمجية.
لا نيولين، لا داتاريسيفديفنت ...
بدأت التصحيح ومشاهدة الأحداث أوتبوتداتاريسيتد وبدأت تغيير رمز عملية الطفل بطرق مختلفة. تسبب تغيير صغير أدناه الحدث أوتبوتداتاريسيتد لاطلاق النار مع النص موجه، انظر الشكل 4.
من بعض الاختبارات الأخرى، يبدو أن الحدث أوتبوتداتاريسيفد يطلق النار فقط عندما يكون نيولين في الإخراج من عملية الطفل. موجه دون نيولين لن إطلاق الحدث أوتبوتداتاريسيفد وبالتالي العملية الأم لا تحصل على موجه ولا يمكن الرد. طريق مسدود!
تنفيذ بلدي غير متزامن القراءة ستدوت / ستدر.
أنا بحاجة إلى قراءة مطالبات من عملية الطفل التي لا & # 8217؛ ر بلدي رمز ولكن تطبيق وحدة التحكم 3rd الطرف، لذلك في نهاية المطاف كنت بحاجة إلى أن تكون قادرة على تلقي المطالبات ث / س نيولينس. حل المسألة المطلوبة لي لتنفيذ بلدي أسينك إو الطبقة لقراءة عملية ستدوت / ستديرور.
أنا خلقت فئة اسمه ستدسترمريدر يقرأ تيار وحرائق الأحداث مشابهة أساسا ل أوتبوتداتاريزيفيد الحدث، إلا أنه لا مفتاح قبالة نيولين لاطلاق النار حدث البيانات الواردة ولكن بدلا من ذلك حرائق بمجرد تلقي البيانات. في الشكل 5 لقد أبرز الاختلافات التعليمات البرمجية في التعليمات البرمجية العملية الأصل باستخدام فئة القارئ الجديد.
رمز ستدريمريدر هو الدنيوية إلى حد ما، ولكن النتيجة كانت كما هو متوقع، انظر الشكل 6.
لاحظ أن "نعم" لم يتم عرض فقط بعد المطالبة - وهذا لأنه تم إرسالها مباشرة إلى ستدين عملية الطفل وعدم عرضها.
انقر للحصول على شفرة المصدر الكامل، والتي يتم توفيرها على أساس "كما هي"، دون أي ضمان من أي نوع.
شارك هذا:
ذات صلة.
آخر الملاحة.
ترك الرد إلغاء الرد.
عمل جميل، هذا هو الحل الدقيق الذي كنت أبحث عنه. نشكرك على تضمين شفرة المصدر.
شكرا مليون، رجل! ويبدو أن هذه المسألة لا تزال ذات صلة بعد 4 سنوات. ساعدني كثيرا.
تدفق الإخراج المخرجات الأحداث.
توفر فئة System. Diagnostics. Process الخيارات لاسترداد كافة الإخراج من عملية خارجية بعد اكتمالها، أو لاسترداد الأحداث التي تحتوي على الإخراج كما يحدث التنفيذ. الخيار لاستقبال أحداث الإخراج غير متزامن مفيد في السيناريوهات حيث تحتاج إلى تقديم تعليقات المستخدمين أو تسجيل الإخراج عندما تحدث مهلات.
عند تلقي أحداث الإخراج غير المتزامن، يجب التأكد من اكتمال العملية الخارجية عندما تريد التأكد من أن تحصل على كافة الإخراج. ومع ذلك، في انتظار هاسكسيتد أن يكون صحيحا ليست كافية. من أجل ضمان اكتمال كافة عمليات المعالجة، بما في ذلك التعامل مع أحداث الإخراج غير المتزامنة، يجب الاتصال ب Process. WaitForExit (). تحتاج إلى استدعاء الزائد اتخاذ أي وسيطات، حتى لو كنت تسمى سابقا process. WaitForExit (Int32) الزائد. الوثيقة process. WaitForExit (Int32) حالة:
لضمان اكتمال معالجة الحدث غير المتزامن استدعاء الزائد ويتفوريكسيت () الذي لا يأخذ أي معلمة بعد تلقي صحيح من هذا التحميل الزائد.
فيما يلي مثال بسيط يستخدم Process. WaitForExit (Int32) لفرض المهلات و Process. WaitForExit () لمسح أحداث الإخراج عند اكتمال العملية.
الأسئلة؟ تعليقات؟ بدء محادثة على تويتر.
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
كيفية قراءة لإنهاء عملية إخراج غير متزامن في C #؟
لدي مشكلة مع قراءة إخراج عملية واحدة بشكل غير متزامن في C #. لقد وجدت بعض الأسئلة الأخرى المماثلة على هذا الموقع لكنها لا تساعدني حقا. هنا هو ما أفعله:
جعل عملية جديدة تعيين ستارتينفو - FileName، وسيطات، كريتينويندو (ترو)، وسشليكسكيوت (فالس)، ريديركتستانداردوتوتبوت (ترو) إضافة معالج الأحداث إلى أوتبوتداتاريفسيف؛ بدء العملية، بيجينأوتوبترادلين ثم ويتفوريكسيت ().
أنه يعمل بشكل جيد ولكن إخراج عملية بدأت يكتب بعض النسب المئوية (٪) التي أريد الحصول عليها ولكن لا أستطيع منذ رمز بلدي يقرأ سطرا سطرا والنسب المئوية لا تظهر.
إليك الرمز الحالي لبرنامجي:
يبدو أن إخراج تيار القراءة بشكل غير متزامن هو كسر قليلا - لا يتم قراءة كافة البيانات قبل خروج العملية. حتى إذا قمت بالاتصال ب process. WaitForExit () وحتى إذا قمت بالاتصال ثم process. Close () (أو ديسبوس ()) لا يزال بإمكانك الحصول على الكثير من البيانات بعد ذلك. انظر alabaxblog. info/2018/06/redirectstandardoutput-beginoutputreadline-pattern-broken/ للحصول على كتابة كاملة، ولكن الحل هو أساسا لاستخدام أساليب متزامنة. لتجنب الجمود، على الرغم من، لديك لاستدعاء واحد منهم على مؤشر ترابط آخر:
بروسيس. ويتفوركسيت () سوف تنتظر حتى الانتهاء غير متزامن الناتج / خطأ تيار القراءة. لسوء الحظ هذا ليس صحيحا ل process. WaitForExit (المهلة) الزائد. هذا هو ما تقوم به فئة العمليات داخليا:
. لذلك سوف ننتظر للقراءة غير متزامن فقط إذا لم يكن هناك مهلة! لإصلاحه ببساطة استدعاء ويتفوريكسيت بارامتريليس () بعد ويتفوريكسيت (مهلة) عاد صحيح:
هناك عدد قليل من الأشياء التي تحصل في طريقها. قد يكون التطبيق وحدة التحكم باستخدام "باكباس" باكسباس الكتابة فوق النسبة المئوية، وربما لا بيغ إلى تيار ستدوت بعد كل الكتابة، و بيجينوتبترادلين ويفترض ينتظر لنهاية السطر قبل إعطائك البيانات.
الإرث المتعدد.
مشتقة من الكثير من الاشياء.
عملية أوسينك أوتبوتداتاريسيفد / إرورداتاريسيفد لديه عيب عند التعامل مع المطالبات.
System. Diagnostics. Process الدرجة - الجزء 2.
في الجزء 1 ناقشت المسألة عند استخدام ستدوت / ستدير إعادة توجيه وقراءتها بشكل متزامن، المخزن المؤقت الإخراج يمكن أن تصبح كاملة ومنع عملية الطفل على التالي "الكتابة". ثم يحدث توقف تام لأن العملية الأصل ينتظر على الطفل للخروج قبل قراءة البيانات من المخزن المؤقت، يتم حظر الطفل على الكتابة لأن المخزن المؤقت هو الكامل، وبالتالي الجمود. الجواب بسيط & # 8211؛ من الأفضل استخدام طريقة غير متزامن من قراءة البيانات من ستدوت / ستدر. هذه القضية هي المتوقعة وكان بلدي سيئة.
لست أنا بل أنت.
لقد واجهت مشكلة أخرى، والتي تبدو وكأنها نفس الجمود، واحد حيث افتراض سيئة في تنفيذ فئة عملية مايكروسوفت تسبب في نوع مختلف من الجمود بين العمليات الأم والطفل. لقد وجدت ذلك عندما دفعتني عملية طفلي إلى تأكيد النشاط المطلوب، انظر الشكل 1 للحصول على مثال.
انتهى موجه بدون خط جديد، وترك المؤشر في نهاية موجه (الذي هو منطقي، لماذا سيتم وضع المؤشر تحت المطالبة وليس بجانبه على الشاشة). انظر الشكل 2 على سبيل المثال رمز هذه المطالبة.
تم ترميز عملية ولي الأمر لتفقد البيانات ستدوت تلقى بشكل غير متزامن، وتبحث عن موجه. إذا / عندما تم استلام موجه، فإن العملية الأم تنبعث ردا على ستدين عملية الطفل. انظر الشكل 3.
ومع ذلك عندما قمت بتشغيل العملية الأم وعملية الطفل أرسلت موجه، النص لم يأت في الحدث أوتبوتداتاريسيتد ... وجلست العملية الأم على p. WaitForExit () خط إلى الأبد ... وكانت عملية الطفل في انتظار رد الذي لم يأت من الوالد، وكنا مرة أخرى في طريق مسدود، وهذه المرة أنا لم يكن لي .... المشكلة ليست في بلدي التعليمات البرمجية.
لا نيولين، لا داتاريسيفديفنت ...
بدأت التصحيح ومشاهدة الأحداث أوتبوتداتاريسيتد وبدأت تغيير رمز عملية الطفل بطرق مختلفة. تسبب تغيير صغير أدناه الحدث أوتبوتداتاريسيتد لاطلاق النار مع النص موجه، انظر الشكل 4.
من بعض الاختبارات الأخرى، يبدو أن الحدث أوتبوتداتاريسيفد يطلق النار فقط عندما يكون نيولين في الإخراج من عملية الطفل. موجه دون نيولين لن إطلاق الحدث أوتبوتداتاريسيفد وبالتالي العملية الأم لا تحصل على موجه ولا يمكن الرد. طريق مسدود!
تنفيذ بلدي غير متزامن القراءة ستدوت / ستدر.
أنا بحاجة إلى قراءة مطالبات من عملية الطفل التي لا & # 8217؛ ر بلدي رمز ولكن تطبيق وحدة التحكم 3rd الطرف، لذلك في نهاية المطاف كنت بحاجة إلى أن تكون قادرة على تلقي المطالبات ث / س نيولينس. حل المسألة المطلوبة لي لتنفيذ بلدي أسينك إو الطبقة لقراءة عملية ستدوت / ستديرور.
أنا خلقت فئة اسمه ستدسترمريدر يقرأ تيار وحرائق الأحداث مشابهة أساسا ل أوتبوتداتاريزيفيد الحدث، إلا أنه لا مفتاح قبالة نيولين لاطلاق النار حدث البيانات الواردة ولكن بدلا من ذلك حرائق بمجرد تلقي البيانات. في الشكل 5 لقد أبرز الاختلافات التعليمات البرمجية في التعليمات البرمجية العملية الأصل باستخدام فئة القارئ الجديد.
رمز ستدريمريدر هو الدنيوية إلى حد ما، ولكن النتيجة كانت كما هو متوقع، انظر الشكل 6.
لاحظ أن "نعم" لم يتم عرض فقط بعد المطالبة - وهذا لأنه تم إرسالها مباشرة إلى ستدين عملية الطفل وعدم عرضها.
انقر للحصول على شفرة المصدر الكامل، والتي يتم توفيرها على أساس "كما هي"، دون أي ضمان من أي نوع.
شارك هذا:
ذات صلة.
آخر الملاحة.
ترك الرد إلغاء الرد.
عمل جميل، هذا هو الحل الدقيق الذي كنت أبحث عنه. نشكرك على تضمين شفرة المصدر.
شكرا مليون، رجل! ويبدو أن هذه المسألة لا تزال ذات صلة بعد 4 سنوات. ساعدني كثيرا.
تدفق الإخراج المخرجات الأحداث.
توفر فئة System. Diagnostics. Process الخيارات لاسترداد كافة الإخراج من عملية خارجية بعد اكتمالها، أو لاسترداد الأحداث التي تحتوي على الإخراج كما يحدث التنفيذ. الخيار لاستقبال أحداث الإخراج غير متزامن مفيد في السيناريوهات حيث تحتاج إلى تقديم تعليقات المستخدمين أو تسجيل الإخراج عندما تحدث مهلات.
عند تلقي أحداث الإخراج غير المتزامن، يجب التأكد من اكتمال العملية الخارجية عندما تريد التأكد من أن تحصل على كافة الإخراج. ومع ذلك، في انتظار هاسكسيتد أن يكون صحيحا ليست كافية. من أجل ضمان اكتمال كافة عمليات المعالجة، بما في ذلك التعامل مع أحداث الإخراج غير المتزامنة، يجب الاتصال ب Process. WaitForExit (). تحتاج إلى استدعاء الزائد اتخاذ أي وسيطات، حتى لو كنت تسمى سابقا process. WaitForExit (Int32) الزائد. الوثيقة process. WaitForExit (Int32) حالة:
لضمان اكتمال معالجة الحدث غير المتزامن استدعاء الزائد ويتفوريكسيت () الذي لا يأخذ أي معلمة بعد تلقي صحيح من هذا التحميل الزائد.
فيما يلي مثال بسيط يستخدم Process. WaitForExit (Int32) لفرض المهلات و Process. WaitForExit () لمسح أحداث الإخراج عند اكتمال العملية.
الأسئلة؟ تعليقات؟ بدء محادثة على تويتر.
Comments
Post a Comment