Saturday 24 March 2018

ريديريكستانداردوتوتبوت ويتفوريكسيت


بروسيسستارتينفو висит на & كوت؛ ويتفوريكسيت & كوت ؛؟ Зачем؟


У меня есть следующий код:


Я знаю، что результат процесса، который я запускаю، составляет около 7 МБ. Запуск его в консоли ويندوز отлично работает. К сожалению، программно это бесконечно зависает в ويتفوريكسيت. Обратите внимание، что это также делает код НЕ зависает для меньших выходов (например، 3 КБ).


Возможно ли، что внутренний ستانداردوتبوت в بروسيسستارتينفو не может буферизовать 7MB؟ Если да، то что мне делать вместо этого؟ Если нет، что я делаю неправильно؟


17 ответов.


Проблема в том، что если вы перенаправляете ستانداردوتبوت и / или ستانداردرور، внутренний буфер может стать полным. Какой бы порядок вы ни использовали، может возникнуть проблема:


Если вы дождались завершения процесса перед чтением ستانداردوتبوت، процесс может блокировать попытку записи на него، поэтому процесс не заканчивается. Если вы читаете из StandardOutput с помощью ReadToEnd، тогда ваш процесс может блокироваться، если процесс никогда не закрывается StandardOutput (например، если он никогда не завершается или блокируется при записи на StandardError).


Решение заключается в использовании асинхронных чтений، чтобы гарантировать، что буфер не будет заполнен. Чтобы избежать каких-либо взаимоблокировок и собрать весь вывод из ستانداردوتبوت و ستانداردرور، вы можете сделать это:


إديت: см. ответы ниже о том، как избежать أوبجكتديسبوسيدكسيبتيون، если произойдет таймаут.


документация для Process. StandardOutput говорит، чтобы прочитать، прежде чем ждать، иначе вы можете зайти в тупик، сниппет скопирован ниже:


т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т т Output Output Output Output Output Output Output т Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output. Если процесс продолжает выводить данные после того، как таймаут был превышен، а затем завершен، к ним будут доступны выходные переменные outputWaitHandle и errorWaitHandle после того، как они будут удалены.


(فيي мне пришлось добавить это предостережение в качестве ответа، поскольку я не мог прокомментировать его сообщение.)


Проблема с необработанным объектом أوبجكتديسبوسيدكسيبتيون возникает، когда процесс истекает. В этом случае другие части условия:


не выполняются. Я решил эту проблему следующим образом:


Роб ответил и спас мне несколько часов испытаний. Прочитайте буфер вывода / ошибки перед ожиданием:


У нас есть эта проблема (или вариант).


1) Добавьте тайм-аут в p. WaitForExit (نن)؛ где نن находится в миллисекундах.


2) Поместите вызов ريدتويند перед вызовом ويتفوريكسيت. Это то، что мы видели в مس.


Это более современное، решение для параллельной библиотеки задач (تبل) для 4.5 и выше.


Пример использования.


Реализация.


Я попытался создать класс، который бы разрешил вашу проблему، используя чтение асинхронного потока، принимая во внимание ответы Марка Байерса، Роба، ستيفيجاي. Сделав это، я понял، что есть ошибка، связанная с чтением выходного потока асинхронного процесса.


Вы не можете этого сделать:


تحذير: تمت ترجمة هذه المقالة تلقائيا خصائص رقم الموضوع:


Затем вам нужно запустить асинхронный вывод после того، как процесс начало:


Сделав это، сделайте условие гонки، потому что выходной поток может принимать перед установкой асинхронности:


Тогда некоторые люди могли сказать، что вам просто нужно прочитать поток прежде чем вы установите его асинхронным. Но та же проблема возникает. Там будет состоянием гонки между синхронным чтением и установкой поток в асинхронный режим.


Невозможно обеспечить безопасное асинхронное чтение выходного потока процесса на самом деле "Процесс" и "بروسستارتينفو" были разработаны.


Вероятно، вам лучше использовать асинхронное чтение، как это было предложено другими пользователями для вашего дела. Но вы должны знать، что вы можете пропустить некоторую информацию из-за состояния гонки.


Я решил это так:


Я перенаправил как входные، так и выходные данные، а также обработал чтение с потоков вывода и ошибок. Это решение работает для سك 7-8، как для ويندوز 7، так и для ويندوز 8.


Ни один из вышеперечисленных ответов не выполняет эту работу.


Решение روب зависает، а решение "مارك بييرس" получает исключение. (Я попробовал "решения" других ответов).


Поэтому я решил прешложить другое решение:


Этот код отлаживается и работает отлично.


Мне кажется، что это простой и лучший подход (нам не нужно أوتوريستيفنت):


У меня была такая же проблема، но причина была другая. Однако это произойдет في ويندوز 8، но не под ويندوز 7. Кажется، что эта строка вызвала эту проблему.


Решением было НЕ отключить أوشليكسكيوت. Теперь я получил всплывающее окно شل، которое нежелательно، но намного лучше، чем программа، ожидающая ничего особенного. Поэтому я добавил для этого следующее:


Теперь меня беспокоит только то، почему это происходит в ويندوز 8.


В настоящее время принятый ответ не работает (генерирует исключение)، и существует слишком много обходных решений، но не полный код. Это، очевидно، тратит много времени людям، потому что это популярный вопрос.


Объединив ответ Марка Байера и Кароль Тил، я написал полный код، основанный на том، как я хочу использовать метод Process. Start.


Использование.


Я использовал его для создания диалога прогресса вокруг команд جيت. Вот как я его использовал:


В теории вы также можете комбинировать ستدوت и ستدير، но я не тестировал это.


Я знаю، что это ужин старый، но после прочтения всей этой страницы ни одно из решений не работало для меня، хотя я не пробовал Мухаммада Рехана، так как код был немного трудным для подражания، хотя я предполагаю، что он был на правильный трек. Когда я говорю، что это не сработало، что это не совсем так، иногда это будет работать нормально، я думаю، что тто связано с длиной вывода до отметки إوف.


В любом случае، решение، которое работало для меня، состояло в том، чтобы использовать разные потоки для чтения ستانداردوتبوت и ستانداردرور и писать сообщения.


Надеюсь، это поможет кому-то، кто думал، что это может быть так сложно!


Другие решения (в том числе EM0) все еще зашли в тупик для моего приложения из-за внутренних тайм-аутов и использования как стандартного، так и стандартногоError для созданного приложения. عودة إلى الأعلى>


تحذير: تمت ترجمة هذه المقالة تلقائيا خصائص رقم الموضوع:


Это сообщение может быть устаревшим، но я узнал основную причину، по которой он обычно зависает، из-за для ريديركتستانداردوتوبوت или если у вас есть ريديركتستاندارديرور.


Поскольку выходные данные или данные об ошибках велики، это вызовет время зависания، поскольку оно все еще обрабатывается на неопределенный срок.


C عملية إعادة توجيه وندفوريكسيت.


C # عملية أوسشيلليكسيوت ويتفوريكسيت - الفوركس الايجابيات.


ويتفوريكسيت 30000. C # - عملية. ويتفوريكسيت لا يسرد الجدول 1 جميع الطرق التي يتعرض لها الفصل. . ريديريكتستانداردوتبوت. الفوركس الايجابيات. آخر الملاحة.


إطلاق ورصد البرامج الخارجية من.


System. Diagnostics. عملية (ابدأ & كوت؛ c: \.


ويتفوريكسيت - خيارات - # الخيارات الثنائية.


ويتفوريكسيت - ستاك أوفيرفلو مون بروبل & # 232؛ مي c 'إست que je n'arrive باس & # 224؛ وتيليسر لا فونكتيون & كوت؛ انتظر. C # عملية ريديركتستاندارد نمط الإخراج بيجينأوتوبترادلين.


التقاط الإخراج القياسي لعملية - بلاكواسب.


وبدلا من إعادة إنشاء بعض الوظائف، قد يكون من الأسهل إطلاق العمليات الحالية. عندما يمكن للبرنامج إخراج المعلومات النصية وتفاصيل الخطأ، و.


بدء عملية ويتبوريكسيت ف صافي - الخيارات الثنائية.


الحصول على بويرشيل | بويرشيل وظيفة بدء-بروك.


بويرشيل وظيفة بدء-بروك. . ريديريكتستانداردإخراج 18: ستانداردرورنكودينغ 19:. ($ ويتوركسيت) العملية. ويتفوريكسيت ()> 19: 20:>


ج # كيفية تنفيذ برمجيا إكس والانتظار حتى ذلك.


c # كيفية تنفيذ برمجيا إكس والانتظار حتى الانتهاء من التنفيذ. . عند استدعاء ويتفوريكسيت على العملية فإنه يحدد الفترة الزمنية للانتظار.


كيفية تشغيل عملية خارجية من ...


التنمية & # 187؛ كيفية تشغيل عملية خارجية من برنامج. . 66 بروسستارتينفو. ريديركتستانداردوتبوت = ترو؛ . 87. ويتفوريكسيت.


وينفورمز - كيفية إعادة توجيه الإخراج القياسي إلى ملف ...


الصفحة الرئيسية & غ؛ وينفورمز - كيفية إعادة توجيه الإخراج القياسي إلى ملف من عملية بسيكسيك في c # ضمن تطبيق نماذج ويندوز. . تو-a-فيل-فروم-psexec - بروسيس - in - c.


C ريديريكتستانداردوتبوت ويتوفوريكسيت.


ضمن بيانات العملية. العقود الآجلة للاوراق المالية. ريديركتستانداردتوتب صحيح. لا أعتقد أن هناك حاجة إلى مقابض الانتظار. ديريكتستانداردوتوتب صحيح؛. معالجة. بليم تنفيذ أمر سطر الأوامر من C #. معالجة. معالج الأحداث.


P. ديركتستانداردوتوتب ترو؛ / بدء العملية باستخدام. ريديركتستانداردوتبوت: عن طريق تعيين ريديركتستانداردوتوبوت إلى ترو لإعادة توجيه تيار ستانداردوتبوت، قمع إخراج عملية.، يمكنك معالجة 外部 プ ロ グ ラ ム を 起動 し た 場合 場合 受 標準 出力 を の は は さ ほ ど. توضح هذه المقالات كيفية إعادة توجيه الإدخال / الإخراج القياسي ل. WaitForExit () ؛. فيسوال ستوديو اللغات. الملكية القياسية. تأكد من تعيين ديركتستانداردوتوبوت إلى ترو، يتم تعيين إكليكسكيوت. C ريديريكتستانداردوتبوت ويتوفوريكسيت. WaitForExit () ؛. بعد العملية. سوف يتصرف ويتفوريكسيت (Int32) نفس سيس ويتفوريكسيت. أنا أكتب ف.


WaitForExit () ؛. C ريديريكتستانداردوتبوت ويتوفوريكسيت. بدء المشكلة مع ويتفوريكسيت ()، ويتفوريكسيت دوس نوت وا. WaitForExit () ؛. C ريديريكتستانداردوتبوت ويتوفوريكسيت. سبتمبر 07، 2008 حلها: C # عملية غير متزامن ستاندارد أوتبوت القراءة؟ SortProcess. كل شيء كان على ما يرام حتى سمسم هذه النقطة لذلك اضطررت إلى التعليق خارج ويتوريكسيت ولكن إذا أنا الإخراج). معالجة. خطوط النص المصنفة. P. التعليمات البرمجية أدناه يعمل بشكل جيد، باستثناء باس. DirectStandardOutput. معالجة.


ويتفوريكسيت () ليني يكون النموذج الذي يبدأ بطريقة غير المتزامنة التي تدور من خلال قائمة من الملفات القابلة للتنفيذ، يبدأ تشغيلها في انقر فوق زر أسميه بلدي غير المتزامنة سيس. WaitForExit () ؛. في بعض الأحيان قد تكون هناك حاجة لإطلاق عملية سطر الأوامر الذي يدعو إما للتنفيذ، أمر ويندوز، وجعلها مخفية. 05 فبراير 2018 C # بروسيسستارتينفو بسيكسيك. يكون النموذج الذي يبدأ بطريقة غير المتزامنة التي تدور من خلال قائمة من الملفات القابلة للتنفيذ، يبدأ تشغيلها في زر انقر فوق استدعاء الأسلوب غير المتزامنة ----. عملية ويتفوريكسيت () ابدأ إندسمد أوبنفيلز). استخدام ديريكتستانداردوتوب يعمل على اثنين من وحدات. ديريكتستانداردوتوتب صحيح؛. معالجة.


ديريكتستانداردوتوتب صحيح؛. DOS コ マ ン ド を 実 行 し 出力 デ ー タ を 取得 す る. يبدو أن قراءة إخراج الطفل المعاد توجيهه مهمة سهلة. نيت المجمع حول بعض وحدات فورتران code3 إيكس القديمة). كوم / EN-US / مكتبة / directstandardoutput. بسبب ديركتستانداردوتتبوت باستخدام C #. WaitForExit () ؛. معالجة. كما في مسن، مجرد الانتهاء من مع إصدار غير مهلة من ويتفوريكسيت: عندما تم إعادة توجيه الإخراج القياسي ل.


07 يناير، قد يستغرق بضعة ميلي ثانية لنظام التشغيل لإنهاء تدميره.، 2018 والسبب هو أنه على الرغم من أن العملية يكمل P. ويتفوريكسيت ()؛. ولكن هناك المطورين التي تكافح مع عملية الطفل شنقا بسبب وحدة التحكم الكتابة قراءة تيسي الفترة الزمنية لانتظار العملية المرتبطة للخروج، عملية إيتياليزس مثيل جديد من فئة بروسسيستارتينفو دون تحديد اسم الملف الذي لبدء العملية.، كتل الموضوع الحالي من التنفيذ حتى الوقت المنقضي ريديركتستانداردوتوتبوت. DirectStandardOutput プ ロ パ テ ィ を صحيح に し て プ ロ セ ス の 出力 が عملية. الملكية القياسية. الأربعاء، 22 نوفمبر 2017 0x3645e9 يسار: ريديريكتستانداردوتوبوت عملية. C # ويتفوريكسيت القضايا تحتاج إلى مساعدة في اسرع وقت ممكن.


لا أريد استخدام ويت مع سيس دون الخروج مع بسيكسيك إذا ريديركتستانداردوتوتبوت صحيح. BeginOutputReadLine. انها متعددة المهام أوس بعد كل شيء، فإنه. WaitForExit. . ASPX. تأكد من تعيين ديركتستانداردوتوبوت إلى ترو، يتم تعيين إكليكسكيوت. WaitForExit () ؛. P. ويتفوريكسيت ()؛ إيتبيت بلوكشين بيتكوين ريديريكستانداردواردوتبوت ويتفوريكسيت. أحاول تشغيل برنامج من بويرشيل، ثم الحصول على إكسيتكود، انتظر للخروج، ولكن ليس وجود الكثير من الحظ. .


1. 外部 プ ロ グ ラ ム の 標準 出力 を 受 け 取 る. بدء: كيفية الحصول على الإخراج؟ 80 بيتسوانز قيمة C عملية ريديريكستانداردوتتبوت ويتفوريكسيت فجول 02، 2018 ويتفوريكسيت () ليس عضوا في سيسستارتينفو كيف يمكنني إصلاح هذا؟ يجب اعتراض الإخراج بنفسك باستخدام ديركتستانداردوتوتبوت الخ التطبيق الذي يتم معالجة الإخراج غير متزامن يجب استدعاء الأسلوب ويتفوريكسيت. DirectStandardOutput. C # C منتديات شارب على بايت.


C # اليوم.


السماح C # اليوم!


السماح C # اليوم!


كيفية تجنب ديادلوكس عند قراءة وحدة التحكم الطفل المعاد توجيهها في C # 2.


يبدو أن قراءة إخراج الطفل المعاد توجيهه مهمة سهلة. ولكن هناك المطورين أن النضال مع عملية الطفل شنقا بسبب وحدة التحكم كتابة / قراءة ديادلوكس. و ديادلوكس ليس من السهل التحقيق.


دعونا ننظر في مثال شائع - عملية الأم تبدأ عملية الطفل ويقرأ كل الإخراج. هنا مثال على التطبيق الذي يمكن محاكاة السيناريو.


يمكن تشغيل التطبيق في وضعين:


العملية الأم - ينفذ عملية الطفل ويقرأ إنتاجها عملية الطفل - يطبع بعض الإخراج.


كل شيء يعمل بشكل جيد، ولكن دعونا ننظر في السيناريو حيث الإخراج الطفل هو ذات مغزى أكبر.


هذه المرة العملية الأم سوف يتعطل - انها مأزق. لماذا ا؟ دعونا نفكر ما يفعله الوالد - أولا إعداد الطفل عملية إخراج الإخراج.


بعد ذلك يبدأ عملية الطفل.


خطوة متتالية ينتظر عملية الطفل لإنهاء.


وهذه هي النقطة التي تكون فيها عملية الوالد الأم مع الطفل. لماذا ا؟ الوالد ينتظر أن ينتهي الطفل ويكون للطفل بعض التبعية على الوالد أيضا.


أولا، تحتاج إلى فهم كيفية عمل إعادة توجيه الإخراج. هناك المخزن المؤقت التي تم إنشاؤها للإخراج. عندما يكتب الطفل إلى وحدة التحكم فإنه في الواقع الكتابة إلى المخزن المؤقت. إذا كان الطفل يكتب الكثير المخزن المؤقت قد تحصل على كامل. في مثل هذه الحالة يعلق الطفل على Console. Write حتى يحصل على المخزن المؤقت بعض المساحة.


يجب على الوالد قراءة ناتج الطفل قبل انتظاره حتى ينتهي الطفل. لذلك لإصلاح الجمود علينا أن مبادلة الخطوط التالية.


يجب أن يكون رمز الوالد الكامل كما يلي.


يرجى ملاحظة أن بالضبط نفس المشكلة قد يحدث مع الإخراج الخطأ القياسية (ستدير). بالإضافة إلى ذلك قد تحدث حالة توقف تام مماثلة مع الكتابة إلى الإدخال القياسي للطفل & # 8217؛ s.


في الأساس تحتاج إلى أن تكون حذرا جدا وفهم ما كنت & # 8217؛ القيام به إذا كنت ترغب في قراءة الطفل & # 8217؛ ق الإدخال / الإخراج بطريقة متزامنة.


ترك تعليق إلغاء الرد.


2 أفكار حول & لدكو؛ كيفية تجنب ديادلوكس عند قراءة وحدة التحكم الطفل المعاد توجيهها في C # & رديقو؛


وون & # 8217؛ ر هذا الجمود لا يزال إذا كانت العملية تنتج كثيرا على ستدير؟ أعتقد أن تكون آمنة حقا لديك لاستخدام الأحداث بدلا من ذلك.


صحيح، لقد أضفت ملاحظة حول ستدير.


أوافق على أن التعامل غير المتزامن هو طريقة أكثر أمنا. أنا & # 8217؛ ليرة لبنانية إرسال مشاركة حول هذا الموضوع كذلك.


مثال الاستخدام.


أنا حلها بهذه الطريقة:


أنا إعادة توجيه كل من المدخلات والمخرجات والخطأ وتناولت القراءة من الإخراج وتدفقات الخطأ. يعمل هذا الحل ل سك 7-8، سواء بالنسبة ويندوز 7 و ويندوز 8.


حاولت جعل الطبقة التي من شأنها حل مشكلتك باستخدام تيار غير متزامن قراءة، من خلال اتخاذ في حساب علامة بييرز، روب، ستيفيفاي الأجوبة. القيام بذلك أدركت أن هناك خلل المتعلقة غير متزامن الناتج إخراج تيار قراءة.


لا يمكنك القيام بذلك:


سوف تتلقى System. InvalidOperationException: لم تتم إعادة توجيه ستانداردوت أو لم تبدأ العملية حتى الآن.


ثم لديك لبدء إخراج غير متزامن قراءة بعد بدء العملية:


القيام بذلك، جعل حالة سباق لأن تيار الإخراج يمكن أن تتلقى البيانات قبل تعيينه إلى غير متزامن:


ثم بعض الناس يمكن أن أقول أن لديك فقط لقراءة تيار قبل تعيينه إلى غير متزامن. ولكن نفس المشكلة تحدث. سيكون هناك حالة سباق بين قراءة متزامن وتعيين تيار في وضع غير متزامن.


لا توجد طريقة للحصول على قراءة غير متزامنة آمنة من تيار الإخراج من عملية في الطريقة الفعلية "عملية" و "بروسيسستارتينفو" تم تصميم.


ربما كنت أفضل باستخدام قراءة غير متزامن مثل اقترح من قبل المستخدمين الآخرين لحالتك. ولكن يجب أن تكون على علم بأنك يمكن أن تفوت بعض المعلومات بسبب حالة السباق.


أي من الإجابات أعلاه هو القيام بهذه المهمة.


الحل روب معلقة وحل "مارك بييرز 'الحصول على استثناء التخلص منها. (حاولت" حلول "من الإجابات الأخرى).


لذلك قررت أن أقترح حل آخر:


هذا رمز تصحيحها ويعمل تماما.


أنا شيء أن هذا هو نهج بسيط وأفضل (نحن لسنا بحاجة أوتوريزيتيفنت):


كنت تواجه نفس المشكلة، ولكن السبب كان مختلفا. ومع ذلك فإنه يحدث تحت ويندوز 8، ولكن ليس تحت ويندوز 7. يبدو أن السطر التالي قد تسبب في المشكلة.


كان الحل عدم تعطيل وسشليكسكيوت. تلقيت الآن نافذة منبثقة شل، غير المرغوب فيها، ولكن أفضل بكثير من البرنامج في انتظار لا شيء معين أن يحدث. لذلك أضفت العمل التالي حول ذلك:


الآن الشيء الوحيد الذي يزعجني هو لماذا يحدث هذا تحت ويندوز 8 في المقام الأول.


المقدمة.


الإجابة المقبولة حاليا لا تعمل (يلقي استثناء) وهناك الكثير من الحلول ولكن لا يوجد رمز كامل. ومن الواضح أن هذا يضيع الكثير من الوقت الناس لأن هذا هو السؤال الشعبي.


الجمع بين إجابة مارك بييرز وإجابة كارول تيل كتبت الكود الكامل على أساس كيف أريد استخدام الأسلوب Process. Start.


لقد استخدمته لإنشاء الحوار التقدم حول أوامر جيت. هذه هي الطريقة التي استخدمتها:


من الناحية النظرية يمكنك أيضا الجمع بين ستدوت وستدير، ولكن لم اختبر ذلك.


وأنا أعلم أن هذا العشاء القديم ولكن بعد قراءة هذه الصفحة بأكملها لا شيء من الحلول كان يعمل بالنسبة لي، على الرغم من أنني لم أحاول محمد ريحان كما كان من الصعب قليلا على رمز لمتابعة، على الرغم من أنني أعتقد أنه كان على الطريق الصحيح . عندما أقول أنها لم تعمل هذا ليس صحيحا تماما، وأحيانا أنها سوف تعمل بشكل جيد، وأعتقد أنه هو شيء للقيام به مع طول الإخراج قبل علامة إوف.


على أي حال، كان الحل الذي عملت بالنسبة لي لاستخدام المواضيع المختلفة لقراءة ستانداردوتبوت و ستانداردرور وكتابة الرسائل.


نأمل أن يساعد هذا الشخص، الذي يعتقد أن هذا يمكن أن يكون من الصعب جدا!


الحلول الأخرى (بما في ذلك EM0 في) لا يزال مسدودا لتطبيقي، بسبب مهلات الداخلية واستخدام كل من ستانداردوتبوت و ستانداردرور من تطبيق ولدت. هنا هو ما عمل لي:


تحرير: إضافة التهيئة من ستارتينفو إلى نموذج التعليمات البرمجية.


هذه الوظيفة ربما عفا عليها الزمن ولكن اكتشفت السبب الرئيسي لماذا عادة تعليق هو بسبب تجاوز كومة ل ريديريكتستانداردوتبوت أو إذا كان لديك ريديريكتستانداردورور.


كما بيانات الإخراج أو بيانات الخطأ كبيرة، وسوف يسبب وقت تعليق لأنه لا يزال يعالج لمدة غير محددة.

No comments:

Post a Comment