Thursday, 1 February 2018

C # عملية ويتفوريكسيت الإخراج القياسية


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

C # بروسيس ويتفوريكسيت ستاندارد أوتبوت
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
القضاء على process. WaitForExit () / ستانداردوتبوت حالة توقف تام.
لقد قرأت عن حالة الجمود هذه أنني متأكد تماما أن يؤثر على التعليمات البرمجية (أدناه). ما لا أفهمه هو: عملت هذه التعليمات البرمجية بشكل جيد تماما على ويندوز سيرفر 2003 (2.0) على مدى السنوات ال 12 الماضية. الآن نحن نحاول نقله إلى ويندوز سيرفر 2012، حيث دائما ديادلوكس.
بينما يتم إنشاء دلز ل "أنيسبو" (لا يزال استهداف 2.0)، يتم تشغيل العملية القابلة للتنفيذ على الاطلاق 32 بت، والانتقال من سيرفر 2003 إلى سيرفر 2012 يذهب من نظام التشغيل 32 بت إلى 64 بت.
أعتقد أنني أفهم ما يجب القيام به لحل هذه المشكلة، ولكن هل يعلم أحد لماذا هذا السلوك قد تغيرت من خادم 2003 إلى خادم 2012؟
لا يزال وجود حالة توقف تام غامضة، حتى بعد تغيير الشفرة أعلاه كما هو موصى به:
ما هي الظروف الأخرى التي يمكن أن تسبب هذا الجمود؟ إذا كنت لفحص ستانداردرور، فإنه يكشف أي شيء مفيد؟
فويو، قمنا بتوفير آخر ويندوز سيرفر 2003 (32 بت)، الذي يقوم بتشغيل إيس 6. كان هذا التكوين الجهاز الأصلي هذا الرمز تشغيل لمدة 12 سنوات (مع وجود توقف تام في بعض الأحيان). نفس التعليمات البرمجية التي ديادلوكس على خادم 2012 إيس 8 لا دادلوك على هذا الخادم 2003.
لدينا الآن لدينا الحد الأدنى من التعليمات البرمجية الكاملة التي تستنسخ هذه المسألة. ومع ذلك، فإن. exe لدينا ترخيص أن يتم تنفيذها من قبل العملية لديها بنود السرية التي تمنعنا من النشر. وأنا أدرك أن لا يساعد الخبراء هنا.
تلميح واحد واجهنا هو أنه عند تشغيل عبر مصحح أخطاء فيسوال ستوديو 2013 مثبت على الملقم الفعلي العملية لا توقف تام / تعليق، أثناء استدعاء العملية من مستعرض خارج الملقم لا. والغريب - من متصفح على خادم 2012 لا يمكننا الاتصال إلى صفحة الاختبار هذه - المتصفح يقول فقط "ربط" وفي نهاية المطاف مرات (ومع ذلك، مواقع أخرى استضافتها نفس الخادم / نفس إيس 8 يمكن الوصول إليها من متصفح على الخادم!)
بما أن نفس معلمات سطر الأوامر التي يتم تشغيلها يدويا من شل أمر الأمر أو شل الأمر غير مسؤول يعمل تماما، فإنه من الصعب أن نعتقد أنها مشكلة 64 بت / WOW64 مع هذا التنفيذ 32 بت أو دلز المطلوبة. نحن نواصل البحث عن الأماكن قد تكون أذوناتنا تسبب مشاكل (تحتاج العملية إلى الكتابة إلى مجلد مؤقت، الذي وضعناه في c: \ تيمب، في الوقت الراهن).
ما يمكنني أن أقول لكم هو أن التعليمات البرمجية الخاصة بك كان دائما كسر، وكان دائما احتمال الجمود. فشلت في قراءة أي شيء من العملية حتى يتم إنهاء العملية، ولكن قد لا تكون العملية قادرة على الخروج، إذا كان يكتب الكثير من البيانات إلى ستدوت أن المخزن المؤقت يملأ وكتل العملية.
إذا لم تكن قد أعدت أي شيء، ولكن وجدت أن ترى الجمود الآن عندما لم يكن من قبل، ثم التفسير الأكثر احتمالا هو أن العملية التي بدأت يكتب أكثر إلى ستدوت مما كان عليه. أي. كل من الإخراج المستخدمة لتناسب في المخزن المؤقت من قبل، ولكن الآن لا. (أعتقد أنه من الممكن أيضا تم تقليل حجم المخزن المؤقت في نظام التشغيل الأحدث، ولكن هذا يبدو من غير المرجح بالنسبة لي.)
يجب المضي قدما ونقل المكالمة إلى ريادتويند (). في الواقع، يجب عليك التخلص من ويتفوريكسيت () تماما. إذا كنت تتصل ريادتويند ()، التي لن تكتمل حتى العملية قد خرجت في الواقع على أي حال، لذلك استدعاء ويتفوريكسيت () بعد ذلك سيكون عديم الفائدة.

معالجة . طريقة ويتفوريكسيت ()
تحتوي الوثائق المرجعية أبي على منزل جديد. انتقل إلى متصفح أبي على docs. microsoft للاطلاع على التجربة الجديدة.
لإرشاد مكون العملية بالانتظار إلى أجل غير مسمى للخروج من العملية المقترنة.
الجمعية: النظام (في System. dll)
تعذر الوصول إلى إعداد الانتظار.
لم يتم تعيين معرف العملية، ولا يمكن تحديد التعامل الذي يمكن تحديد الخاصية إد.
لا توجد عملية مقترنة كائن العملية هذه.
أنت تحاول الاتصال ويتفوريكسيت () لعملية قيد التشغيل على كمبيوتر بعيد. تتوفر هذه الطريقة فقط للعمليات التي يتم تشغيلها على الكمبيوتر المحلي.
ويتفوريكسيت () يجعل الانتظار مؤشر الترابط الحالي حتى ينتهي العملية المقترنة. وينبغي أن يسمى بعد أن يتم استدعاء جميع الطرق الأخرى على العملية. لتجنب حظر مؤشر الترابط الحالي، استخدم الحدث الذي تم الخروج منه.
تقوم هذه الطريقة بإرشاد مكون العملية إلى الانتظار لوقت غير محدود من الوقت للخروج من العملية ومعالجات الأحداث. قد يؤدي هذا إلى توقف التطبيق عن الاستجابة. على سبيل المثال، إذا قمت باستدعاء كلوسمينويندو لعملية تحتوي على واجهة مستخدم، قد لا يتم التعامل مع الطلب إلى نظام التشغيل إنهاء العملية المقترنة إذا تمت كتابة العملية عدم إدخال حلقة الرسائل.
في الإطار 3.5 والإصدارات السابقة، انتظر التحميل الزائد ويتفوريكسيت () ل ماكسفالو ميلي ثانية (حوالي 24 يوما)، وليس إلى أجل غير مسمى. أيضا، الإصدارات السابقة لم تنتظر معالجات الحدث للخروج إذا تم الوصول إلى الوقت ماكسفالو الكامل.
يضمن هذا التحميل الزائد أن جميع عمليات المعالجة قد اكتملت، بما في ذلك التعامل مع الأحداث غير المتزامنة للإخراج القياسي المعاد توجيهه. يجب استخدام هذا التحميل الزائد بعد إجراء مكالمة إلى التحميل الزائد ويتفوريكسيت (Int32) عند إعادة توجيه الإخراج القياسي إلى معالجات الأحداث غير المتزامنة.
عند إنهاء عملية مقترنة (أي عندما يتم إيقاف تشغيله بواسطة نظام التشغيل من خلال إنهاء عادي أو غير طبيعي)، يقوم النظام بتخزين المعلومات الإدارية حول العملية ويعود إلى المكون الذي كان يسمى ويتفوريكسيت (). يمكن لمكون العملية ثم الوصول إلى المعلومات، والتي تتضمن إكسيتيمي، باستخدام مقبض إلى العملية خرجت.
لأن العملية المرتبطة قد خرجت، الخاصية مقبض المكون لم يعد يشير إلى مورد عملية موجود. بدلا من ذلك، يمكن استخدام المقبض فقط للوصول إلى معلومات نظام التشغيل حول مورد العملية. النظام على بينة من مقابض للخروج من العمليات التي لم يتم إصدارها من قبل مكونات العملية، لذلك فإنه يحتفظ إكسيتيمي والتعامل مع المعلومات في الذاكرة حتى يقوم مكون العملية بتحرير الموارد على وجه التحديد. لهذا السبب، في أي وقت استدعاء بدء تشغيل مثيل عملية استدعاء إغلاق عند انتهاء العملية المقترنة ولم تعد بحاجة إلى أية معلومات إدارية حول هذا الموضوع. إغلاق يحرر الذاكرة المخصصة لعملية خرجت.
راجع قسم الملاحظات من صفحة مرجع الخاصية ستانداردرور.
للحصول على الثقة الكاملة للمتصل الفوري. لا يمكن استخدام هذا العضو من خلال شفرة موثوق بها جزئيا.

معالجة . طريقة بيجينأوتوبترادلين ()
تحتوي الوثائق المرجعية أبي على منزل جديد. انتقل إلى متصفح أبي على docs. microsoft للاطلاع على التجربة الجديدة.
بدء عمليات القراءة غير المتزامنة على تيار المعاد توجيهه المعاد توجيهه للتطبيق.
الجمعية: النظام (في System. dll)
عملية القراءة غير المتزامنة قيد التقدم بالفعل على تيار ستانداردوتبوت.
تم استخدام تيار ستاندارد أوتبوت من خلال عملية قراءة متزامنة.
يمكن قراءة تيار ستاندارد أوتبوت بشكل متزامن أو غير متزامن. طرق مثل القراءة، ريادلين، و ريادتويند تنفيذ عمليات القراءة المتزامنة على تيار الإخراج من العملية. لا تكتمل عمليات القراءة المتزامنة هذه إلا بعد أن تكتب العملية المرتبطة بها إلى تيار ستاندارد أوتبوت، أو تغلق البث.
في المقابل، يبدأ بيجينأوتوبترادلين عمليات القراءة غير متزامنة على تيار ستانداردوتبوت. هذه الطريقة تمكن معالج الحدث المعين لإخراج تيار وعودة فورا إلى المتصل، والتي يمكن أن تؤدي أعمال أخرى في حين يتم توجيه إخراج تيار إلى معالج الحدث.
اتبع الخطوات التالية لإجراء عمليات قراءة غير متزامنة على ستانداردوتبوت لعملية:
إضافة معالج الحدث إلى الحدث أوتبوتداتاريسيتد. يجب أن تتطابق معالج الحدث مع System. Diagnostics. توقيع مندوب داتاريسيفنتاندلر.
استدعاء بيجينوتبترادلين للعملية. تبدأ هذه المكالمة عمليات قراءة غير متزامنة على ستانداردوتبوت.
عند بدء تشغيل عمليات قراءة غير متزامنة، يتم استدعاء معالج الحدث في كل مرة تقوم العملية المقترنة بكتابة سطر من النص إلى دفق ستانداردوتبوت.
يمكنك إلغاء عملية قراءة غير متزامنة من خلال استدعاء كانسيلوتوبريد. يمكن إلغاء عملية القراءة من قبل المتصل أو معالج الحدث. بعد الإلغاء، يمكنك الاتصال بيجينوتبترادلين مرة أخرى لاستئناف عمليات القراءة غير المتزامنة.
لا يمكنك مزج عمليات القراءة غير المتزامنة والمتزامنة على دفق تمت إعادة توجيهه. وبمجرد فتح دفق المعاد توجيهه للعملية إما في وضع غير متزامن أو متزامن، يجب أن تكون جميع عمليات القراءة الأخرى على هذا البث في نفس الوضع. على سبيل المثال، لا تتبع بيجنوتبترادلين مع استدعاء إلى ريادلين على تيار ستاندردوتبوت، أو العكس بالعكس. ومع ذلك، يمكنك قراءة اثنين من تيارات مختلفة في أوضاع مختلفة. على سبيل المثال، يمكنك الاتصال بيجينوتبترادلين ثم استدعاء ريادلين لتيار ستانداردورور.
يوضح المثال التالي كيفية إجراء عمليات قراءة غير متزامنة على تيار ستانداردوتبوت المعاد توجيهه من الأمر نوع. الأمر نوع هو تطبيق وحدة التحكم التي يقرأ ويصنف إدخال النص.
ينشئ المثال مفوض حدث لمعالج أحداث سورتوتوثاندلر ويربطه مع الحدث أوتبوتداتاريسيفد. يتلقى معالج الحدث خطوطا نصية من تيار المعتاد المعاد توجيهه، ويقوم بتنسيق النص، ويكتب النص على الشاشة.
للحصول على الثقة الكاملة للمتصل الفوري. لا يمكن استخدام هذا العضو من خلال شفرة موثوق بها جزئيا.

No comments:

Post a Comment