Monday 26 March 2018

عملية ريادتويند ويتفوريكسيت


سجل والتر.
. الكتابة أثناء التعلم.
الجمعة 18 تشرين الثاني / نوفمبر 2018.
process. WaitForExit (Int32) معلقة المشكلة.
كما ترون، التعليمات البرمجية يبدأ عملية "cmd. exe" ويمر إليها الأمر أريد أن يتم تنفيذها.
في التعليمات البرمجية استخدم الأمر بينغ - t 8.8.8.8 الذي، بسبب الخيار - t، بينغ المضيف دون توقف. ما يحدث؟ عملية "cmd. exe" جنبا إلى جنب مع الأمر بينغ - t أبدا يخرج ولا يغلق تيار ستدوت وهكذا تعليق التعليمات البرمجية لدينا في أوتبوت = process. StandardOutput. ReadToEnd ()؛ خط لأنه لا يمكن أن تنجح قراءة كل تيار.
يحدث نفس الشيء أيضا إذا كان الأمر في ملف دفعي يعلق لأي سبب من الأسباب، وبالتالي فإن التعليمات البرمجية أعلاه يمكن أن تعمل بشكل مستمر لسنوات ثم تعليق فجأة دون أي سبب واضح.
يمكنك تجربة حالة توقف تام إذا كان الأمر الذي تعلقه على "cmd. exe" أو العملية التي تتصل بها يملأ الإخراج القياسي أو الخطأ القياسي. هذا لأن التعليمات البرمجية لدينا لا يمكن الوصول إلى خطوط.
في واقع الأمر عملية الطفل (الأمر بينغ أو ملف دفعي أو أي عملية كنت تنفذ) لا يمكن أن تستمر إذا برنامجنا لا يقرأ المخازن المؤقتة شغل من تيارات وهذا لا يمكن أن يحدث لأن التعليمات البرمجية هو معلق على الخط مع العملية. ويتفوريكسيت () والتي سوف تنتظر إلى الأبد لمشروع الطفل للخروج.
الحجم الافتراضي لكل من تيارات هو 4096 بايت. يمكنك اختبار هذه الأحجام اثنين مع هذه الملفات دفعة:

عملية تتم قراءتها ويتفوريكسيت
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
ريادتويند من ستد الناتج من العملية و ويتوفريكسيت.
من مثال مسن لاستخدام ستدتبوت من العملية التي تم إنشاؤها حديثا:
إذا بدلا من myStreamReader. ReadLine () أنا باستخدام myStreamReader. ReadToEnd () هل لا يزال يمكنني استخدام myProcess. WaitForExit ()؟ أو ريادتويند () سوف تنتظر حتى يتم الانتهاء من العملية؟
إديت: آسف لتحويل، للإجابة مباشرة سؤالك. نعم، تحتاج إلى الاتصال Process. WaitForExit ()؛ . سيضمن ذلك أن العملية قد أسفرت عن جميع مخرجاتها قبل استدعاء ريادتويند ()
ريدتويند هي وظيفة متزامنة. وبالتالي إذا كنت لا استدعاء في التعليمات البرمجية الخاصة بك، فإنه سيتم حظر مؤشر الترابط الرئيسي الخاص بك حتى يلتقط فقط الإخراج الأول من ستانداردوتبوت، ثم هذا كل شيء. ولكن استخدام ويتفوريكسيت ضمان أن يكون لديك كل شيء.
أيضا قد تفكر في إجراء قراءة غير متزامن من إخراج العملية، راجع هذا مسن مثال الذي يقوم بتنفيذ أوتبوتداتاريسييفيد.
"ريادتويند" هي وظيفة مخزنة في كائن "سترمريدر" ولا أعتقد أن لديها ما تفعله مع انتظار عملية للخروج، ولكن فئة "العملية" قد التعامل مع ذلك في حد ذاته. بالمناسبة، كل قدرات "سترمريدر" ليست مفيدة في الوضع الذي ذكرته.
في وجهة نظري، يجب أن يسمى "ويتفوريكسيت" وكما فعلت "إغلاق" أيضا. لأنهم سيطلقون بعض موارد النظام التي لا يمكن لأي طريقة أخرى. بقدر ما أعرف، طريقة "ريادتويند" لا علاقة له باستدعاء هذين.

العسل الرحمة.
مجرد موقع وورد.
[] الحل: ويتفوريكسيت لا تعمل بعد process. Start ()
لا يتم تشغيل ويتفوريكسيت بعد استدعاء process. Start ().
عندما يكتب عملية نص إلى تيار قياسي، يتم عرض هذا النص عادة على وحدة التحكم. عن طريق إعادة توجيه تيار ستانداردوتبوت، يمكنك معالجة أو قمع إخراج عملية. على سبيل المثال، يمكنك تصفية النص أو تنسيقه بشكل مختلف أو كتابة الإخراج إلى كل من وحدة التحكم وملف سجل معين.
يمكن قراءة تيار ستاندارد أوتبوت المعاد توجيهه بشكل متزامن أو غير متزامن. طرق مثل القراءة، ريادلين، و ريادتويند تنفيذ عمليات القراءة المتزامنة على تيار الإخراج من العملية. لا تكتمل عمليات القراءة المتزامنة هذه إلا بعد أن تكتب العملية المرتبطة بها إلى تيار ستاندارد أوتبوت، أو تغلق البث.
في المقابل، يبدأ بيجينأوتوبترادلين عمليات القراءة غير متزامنة على تيار ستانداردوتبوت. هذه الطريقة تمكن معالج الحدث المعين لإخراج تيار وعودة فورا إلى المتصل، والتي يمكن أن تؤدي أعمال أخرى في حين يتم توجيه إخراج تيار إلى معالج الحدث.
عمليات القراءة المتزامنة إدخال التبعية بين قراءة المتصل من تيار ستانداردوتبوت وعملية الطفل الكتابة إلى ذلك تيار. يمكن أن تؤدي هذه التبعيات إلى حالة توقف تام. عندما يقرأ المتصل من تيار إعادة توجيه عملية الطفل، فإنه يعتمد على الطفل. ينتظر المتصل على عملية القراءة حتى يكتب الطفل إلى تيار أو يغلق تيار. عندما يكتب الطفل عملية ما يكفي من البيانات لملء تيار المعاد توجيهه، فإنه يعتمد على الأصل. تنتظر عملية الطفل عملية الكتابة التالية حتى يقرأ الوالد من التيار الكامل أو يغلق التيار. يحدث حالة حالة توقف تام عندما تنتظر عملية المتصل والطفل على بعضها البعض لإكمال عملية، ولا يمكن المضي قدما. يمكنك تجنب ديادلوكس من خلال تقييم التبعيات بين المتصل وعملية الطفل.
يظهر رمز C # التالي، على سبيل المثال، كيفية القراءة من دفق تمت إعادة توجيهه وانتظر حتى يتم إنهاء العملية الفرعية.
مثال التعليمات البرمجية يتجنب حالة حالة توقف تام عن طريق استدعاء p. StandardOutput. ReadToEnd قبل p. WaitForExit. يمكن أن يحدث حالة توقف تام إذا استدعت العملية الأصل p. WaitForExit قبل p. StandardOutput. ReadToEnd والعملية الطفل يكتب نص كاف لملء تيار المعاد توجيهه. سوف تنتظر العملية الأم إلى أجل غير مسمى لعملية الطفل للخروج. سوف تنتظر عملية الطفل إلى أجل غير مسمى للوالد لقراءة من تيار ستانداردوتبوت الكامل.
هناك مشكلة مماثلة عند قراءة كل النص من كل من الإخراج القياسية وتدفقات الخطأ القياسية. يقوم رمز C # التالي، على سبيل المثال، بتنفيذ عملية قراءة على كلا التدفقين.
مثال التعليمات البرمجية يتجنب حالة توقف تام عن طريق تنفيذ عمليات قراءة غير متزامنة على تيار ستانداردوتبوت. حالة حالة توقف تام إذا استدعت العملية الأصل p. StandardOutput. ReadToEnd متبوعا ب p. StandardError. ReadToEnd والكتابة عملية يكتب ما يكفي من النص لملء تيار الخطأ. سوف تنتظر العملية الأم إلى أجل غير مسمى لعملية الطفل لإغلاق تيار ستاندارد أوتبوت. عملية الطفل سوف تنتظر إلى أجل غير مسمى للوالد لقراءة من تيار ستاندارديرور الكامل.
يمكنك استخدام عمليات القراءة غير المتزامنة لتجنب هذه التبعيات وإمكانية الجمود. بدلا من ذلك، يمكنك تجنب حالة الجمود عن طريق إنشاء اثنين من مؤشرات الترابط وقراءة الإخراج من كل تيار على مؤشر ترابط منفصل.
ذات صلة.
آخر الملاحة.
ترك الرد إلغاء الرد.
ما يصل إلى كل الجسم، انها أول الذهاب لرؤية هذا ويبغلوغ. ثيسويباج يحتوي على بيانات رهيبة وحقيقية حقا في دعم الزوار.

مثال الاستخدام.
أنا حلها بهذه الطريقة:
أنا إعادة توجيه كل من المدخلات والمخرجات والخطأ وتناولت القراءة من الإخراج وتدفقات الخطأ. يعمل هذا الحل ل سك 7-8، سواء بالنسبة ويندوز 7 و ويندوز 8.
حاولت جعل فئة من شأنها أن تحل مشكلتك باستخدام تيار غير متزامن قراءة، من خلال اتخاذ في حساب علامة بييرز، روب، ستيفيفاي الأجوبة. القيام بذلك أدركت أن هناك خلل المتعلقة غير متزامن الناتج إخراج تيار قراءة.
لا يمكنك القيام بذلك:
سوف تتلقى System. InvalidOperationException: لم تتم إعادة توجيه ستانداردوت أو لم تبدأ العملية حتى الآن.
ثم لديك لبدء إخراج غير متزامن قراءة بعد بدء العملية:
القيام بذلك، جعل حالة سباق لأن تيار الإخراج يمكن أن تتلقى البيانات قبل تعيينه إلى غير متزامن:
ثم بعض الناس يمكن أن أقول أن لديك فقط لقراءة تيار قبل تعيينه إلى غير متزامن. ولكن نفس المشكلة تحدث. سيكون هناك حالة سباق بين قراءة متزامن وتعيين تيار في وضع غير متزامن.
لا توجد طريقة للحصول على قراءة غير متزامنة آمنة من تيار الإخراج من عملية في الطريقة الفعلية "عملية" و "بروسيسستارتينفو" تم تصميم.
ربما كنت أفضل باستخدام قراءة غير متزامن مثل اقترح من قبل المستخدمين الآخرين لحالتك. ولكن يجب أن تكون على علم بأنك يمكن أن تفوت بعض المعلومات بسبب حالة السباق.
أي من الإجابات أعلاه هو القيام بهذه المهمة.
الحل روب معلقة وحل "مارك بييرز 'الحصول على استثناء التخلص منها. (حاولت" حلول "من الإجابات الأخرى).
لذلك قررت أن أقترح حل آخر:
هذا رمز تصحيحها ويعمل تماما.
أنا شيء أن هذا هو نهج بسيط وأفضل (نحن لسنا بحاجة أوتوريزيتيفنت):
كنت تواجه نفس المشكلة، ولكن السبب كان مختلفا. ومع ذلك فإنه يحدث تحت ويندوز 8، ولكن ليس تحت ويندوز 7. يبدو أن السطر التالي قد تسبب في المشكلة.
كان الحل عدم تعطيل وسشليكسكيوت. تلقيت الآن نافذة منبثقة شل، غير المرغوب فيها، ولكن أفضل بكثير من البرنامج في انتظار لا شيء معين أن يحدث. لذلك أضفت العمل التالي حول ذلك:
الآن الشيء الوحيد الذي يزعجني هو لماذا يحدث هذا تحت ويندوز 8 في المقام الأول.
المقدمة.
الإجابة المقبولة حاليا لا تعمل (يلقي استثناء) وهناك الكثير من الحلول ولكن لا يوجد رمز كامل. ومن الواضح أن هذا يضيع الكثير من الوقت الناس لأن هذا هو السؤال الشعبي.
الجمع بين إجابة مارك بييرز وإجابة كارول تيل كتبت الكود الكامل على أساس كيف أريد استخدام الأسلوب Process. Start.
لقد استخدمته لإنشاء الحوار التقدم حول أوامر جيت. هذه هي الطريقة التي استخدمتها:
من الناحية النظرية يمكنك أيضا الجمع بين ستدوت وستدير، ولكن لم اختبر ذلك.
وأنا أعلم أن هذا العشاء القديم ولكن بعد قراءة هذه الصفحة بأكملها لا شيء من الحلول كان يعمل بالنسبة لي، على الرغم من أنني لم أحاول محمد ريحان كما كان من الصعب قليلا على رمز لمتابعة، على الرغم من أنني أعتقد أنه كان على الطريق الصحيح . عندما أقول أنها لم تعمل هذا ليس صحيحا تماما، وأحيانا أنها سوف تعمل بشكل جيد، وأعتقد أنه هو شيء للقيام به مع طول الإخراج قبل علامة إوف.
على أي حال، كان الحل الذي عملت بالنسبة لي لاستخدام المواضيع المختلفة لقراءة ستانداردوتبوت و ستانداردرور وكتابة الرسائل.
نأمل أن يساعد هذا الشخص، الذي يعتقد أن هذا يمكن أن يكون من الصعب جدا!
الحلول الأخرى (بما في ذلك EM0 في) لا يزال مسدودا لتطبيقي، بسبب مهلات الداخلية واستخدام كل من ستانداردوتبوت و ستانداردرور من تطبيق ولدت. هنا هو ما عمل لي:
تحرير: إضافة التهيئة من ستارتينفو إلى نموذج التعليمات البرمجية.
هذه الوظيفة ربما عفا عليها الزمن ولكن اكتشفت السبب الرئيسي لماذا عادة تعليق هو بسبب تجاوز كومة ل ريديريكتستانداردوتبوت أو إذا كان لديك ريديريكتستانداردرور.
كما بيانات الإخراج أو بيانات الخطأ كبيرة، وسوف يسبب وقت تعليق لأنه لا يزال يعالج لمدة غير محددة.

كود الحبيب.
مدونة للمدربين من قبل المبرمجين.
العمل مع العمليات في.
وغالبا ما يتم بناء لغات البرمجة والصدفة حول القدرة على عملية واحدة لإطلاق بسهولة والعمل مع نتائج الآخرين. هذا هو الأسلوب الأساسي للتجهيز في باش، في حين يدعم الياقوت 5 على الأقل النهج المدمج مع مستويات مختلفة من المرونة والإيجاز.
في، وهذا هو نوع من العملية يتم عادة عن طريق أبي System. Diagnostics. Process. و أبي العملية عامة جدا وقوية، ولكن يمكن أن يكون من الكعوب وصعبة الاستخدام بشكل صحيح في حالات الاستخدام الشائعة التي يتم التعامل معها بشكل جيد من قبل اللغات المذكورة أعلاه. كما المفسد، انتهى بي الأمر التفاف الكثير من هذا التعقيد في مكتبة جديدة: ميداليونشيل. مع ميداليونشيل، وهذا النوع من المهام هو بطانة واحدة:
المزيد عن ذلك في وقت لاحق، على الرغم من. في الوقت الحالي، دع & # 8217؛ نعود إلى العملية. وكمثال ملموس، أردت مؤخرا طلبي لإطلاق مثيل نوديجس من لتشغيل مترجم أقل كس. كنت بحاجة إلى الكتابة إلى عقدة & # 8217؛ s المدخلات القياسية أثناء التقاط النص الإخراج القياسية، نص الخطأ القياسية، وخروج التعليمات البرمجية.
محاولة أولية.
هنا & # 8217؛ s الشفرة التي بدأت بها:
هذا الرمز مطول تماما. للأسف انها & # 8217؛ عربات التي تجرها الدواب تماما كذلك.
التعامل مع الحجج العملية.
واحدة من المشاكل الأولى نلاحظ مع هذا الرمز هو أن الخاصية وسيطات على بروسيسستارتينفو هو مجرد سلسلة. إذا كانت الوسيطات التي نمر بها ديناميكية، فسنحتاج إلى توفير منطق الهروب المناسب قبل تسلسل لمنع أشياء مثل المسافات في مسارات الملفات من الانهيار. الهروب من سطر الأوامر ويندوز سطر الأوامر معقدة للغاية؛ لحسن الحظ، التعليمات البرمجية اللازمة لتنفيذ ذلك موثقة بشكل جيد في هذه المشاركة ستاكوفيرفلو. وبالتالي، فإن أول تغيير نحن & # 8217 سوف تجعل لإضافة المنطق الهروب:
التعامل مع ديادلوكس.
والمشكلة الأقل وضوحا هي مشكلة الجمود. جميع مسارات العملية الثلاثة (في، خارج، والخطأ) هي محدودة في مقدار المحتوى الذي يمكن عازلة. إذا كان المخزن المؤقت الداخلي يملأ، ثم كل من يكتب إلى تيار سوف كتلة. في هذه الشفرة، على سبيل المثال، لا نقرأ من تيارات الخروج والخطأ إلا بعد انتهاء العملية. وهذا يعني أننا يمكن أن نجد أنفسنا في حالة حيث العادم عوادم عليه & # 8217؛ s المخزن المؤقت الخطأ. في هذه الحالة، سوف عقدة منع على الكتابة إلى خطأ قياسي، في حين يتم حظر التطبيق لدينا القراءة إلى نهاية معيار الخروج. وهكذا، نحن & # 8217؛ وجدنا أنفسنا في طريق مسدود!
يوفر أبي العملية طريقة التي تبدو مصممة للتعامل مع هذا: بيجينوتبوت / إرورريادلين. مع هذه الطريقة، يمكنك الاشتراك في غير المتزامن & # 8220؛ داتاريفسد & # 8221؛ الأحداث بدلا من القراءة من تيارات الإخراج مباشرة. بهذه الطريقة، يمكنك الاستماع إلى كل من تيارات في وقت واحد. لسوء الحظ، هذه الطريقة لا توفر أي وسيلة لمعرفة متى تم استلام آخر بت من البيانات. لأن كل شيء غير متزامن، فمن الممكن (ولقد لاحظت هذا) للأحداث لاطلاق النار بعد عاد ويتفوريكسيت ().
لحسن الحظ، يمكننا توفير الحل البديل الخاص بنا باستخدام المهام لقراءة غير متزامنة من الجداول أثناء الانتظار لعقدة للخروج:
إضافة مهلة.
هناك مسألة أخرى نود التعامل معها وهي مسألة تعليق العملية. بدلا من الانتظار إلى الأبد لعملية الخروج، سيكون لدينا رمز أكثر قوة إذا فرضنا مهلة بدلا من ذلك:
المزامنة على طول الطريق!
بينما نستخدم الآن إو غير متزامن لقراءة من تيارات العملية، ما زلنا نحظر سلسلة ترابط واحدة أثناء انتظار إتمام العملية. يمكننا زيادة تحسين الكفاءة هنا عن طريق الذهاب غير المتزامن تماما:
التكيف مع أحجام البيانات الكبيرة.
وثمة سؤال آخر قد يطرح عند محاولة تعميم هذا النهج هو حجم البيانات. إذا كنا نقوم بتصنيع كمية كبيرة من البيانات من خلال العملية، فسنحتاج على الأرجح إلى استبدال مكالمات ريادتوينداسينك المناسبة مع حلقات قراءة غير متزامنة تعالج كل جزء من البيانات عند ظهورها.
التبديل إلى ميداليونشيل.
لقد قمنا الآن ببناء شفرة (صحيحة) وقوية وفعالة من التعليمات البرمجية للعمل مع عملية من. ومع ذلك، نأمل أن يكون هذا المثال مقتنع لك أن أبي العملية ليست تماما حتى وظيفة عندما يتعلق الأمر سهولة الاستخدام. تحقيقا لهذه الغاية، أنا & # 8217؛ م الذهاب إلى تقديم بديل: مكتبة ميداليونشيل (متوفر على نوجيت). هنا & # 8217؛ s المنطق المكافئ باستخدام ميداليونشيل:
مع ميداليونشيل، يتم هجاء الحجج تلقائيا، يتم تلقائيا مخزنة عملية تيارات لمنع الجمود، وملفوفة كل شيء بشكل جيد في واجهة المستخدم أبي المزامنة غير ودية. نحن دون & # 8217؛ ر حتى ما يدعو للقلق حول ديسبوس (): افتراضيا يتم التخلص من العملية تلقائيا عند الانتهاء من الأمر.
كما يوفر ميداليونشيل الزائد المشغل لتمكين باش مثل إعادة توجيه المدخلات القياسية والإخراج القياسية. وهذا يعني أنه يمكنك استخدام & # 8220؛ & لوت؛ & # 8221؛ و & # 8220؛> & # 8221؛ إلى بيانات الأنابيب من وإلى الجداول والملفات والمجموعات. يمكنك حتى استخدام & # 8220؛ | & # 8221؛ إلى بيانات الأنابيب من عنصر أمر واحد إلى آخر.
مايك أديلسون.
آخر المشاركات التي كتبها مايك أديلسون (انظر جميع)
تنفيذ يساوي () و جيثاسكود () في C # 7 - 3 يونيو 2017 البرمجة في C # - 3 مايو 2017 7 طرق لاستخدام C # 7 تعبيرات رمي ​​- 26 أبريل 2017.
عن مايك أديلسون.
أنا مهندس برمجيات في أبليد بريديكتيف تيشنولوجيز في واشنطن D. C.، حيث أعمل على & # 8220؛ البيانات الكبيرة & # 8221؛ تحليلات وتطوير شبكة الإنترنت. في وقت الفراغ، وأنا أستمتع القراءة، والعمل على مختلف المشاريع الجانبية، والإجابة على الأسئلة حول ستاكوفيرفلو.
آخر الملاحة.
7 أفكار حول & لدكو؛ العمل مع العمليات في & رديقو؛
هل من الممكن القراءة والكتابة لنفس العملية من داخل نفس البرنامج. استخدمت قذيفة ميدالية لقراءة إلى الإخراج من برنامج وحدة التحكم التفاعلية. ولكن عندما أبدأ موضوع مختلف لكتابة الأوامر إلى البرنامج وريتستريم. وريتيلين يبدو فقط لشنق. أنا أحاول السيطرة على بيانوبار (انظر جيثب). هناك بعض الخطوات عند محاولة قراءة خط من العملية والاستجابة بخط. هذا يقودني للجنون.
نعم، يجب أن يكون من الممكن القراءة والكتابة إلى عملية داخل نفس البرنامج. الرجاء التأكد من أنك تستخدم أحدث إصدار من ميداليونشيل وأن الإدخال القياسي للأوامر يتم تعيينه على أوتوفلوش (يجب أن يكون الإعداد الافتراضي).
قد تلاحظ وريتلين لتعليق إذا كان عملية الوجهة إيسن & # 8217؛ ر سحب في البيانات، وتملأ المخزن المؤقت بين العملية (وبالتالي منع تدفق من إكمال).
ومن الصعب بالنسبة لي أن أقول أكثر دون رؤية التعليمات البرمجية الخاصة بك؛ والنظر في نشر وصف أكثر تفصيلا ورمز عينة كمسألة على جيثب / مادلسون / ميداليونشيل.
شكرا مايكل. لقد فعلت ذلك، انها قضية # 9. أعيد قراءة سؤالي. ومن الواضح أنني كنت نائما جدا لكتابة أي شيء. كنت أقصد أن أقول إن هناك بعض الخطوات التي أحتاج إليها وأنا في عداد المفقودين. شيء واضح للجميع من قبلي.
هل من الممكن الانتظار لسلسلة معينة في تيار الإخراج من الأمر؟
بول فوند = أوايت cmd. StandardOutput. Expect (سيرشسترينغ، تيموت)؛
لا توجد وظيفة مضمنة لإجراء ذلك. إذا كانت السلسلة لا تمتد على سطر، فيمكنك إجراء ما يلي:
بينما ((لين = cmd. StandardOutput. ReadLine ())! = نول)
إذا كانت سلسلة البحث تمتد أسطر متعددة، يمكنك استخدام أسلوب حلقة متماثلة حيث يمكنك تتبع آخر حرف N حيث N هو طول سلسلة البحث.

No comments:

Post a Comment