Monday 5 February 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 для созданного приложения. عودة إلى الأعلى>


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


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


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


الخيارات الثنائية.


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


المشكلة. ابدأ المشكلة مع ويتفوريكسيت ()، ويتفوريكسيت دوس.


02/06/2004 & # 0183؛ & # 32؛ لدي نموذج أسب الذي يبدأ بطريقة غير المتزامنة التي تدور من خلال قائمة الملفات القابلة للتنفيذ ويبدأ تشغيلها في زر انقر فوق استدعاء الأسلوب غير المتزامنة.


WaitForExit ()؛ - C # / C حاد.


ريديريكتستانداردوتبوت: لديك حق الوصول إلى معالجة المعلومات بالإضافة إلى تلك المتوفرة عند إرفاق عملية قيد التشغيل. يمكنك استخدام بروسيسستارتينفو.


هل Process. WaitForExit () انتظر حقا؟ | مراجعة الكمبيوتر.


29/12/2008 & # 0183؛ & # 32؛ لماذا لا تستخدم process. OutputDataReceived و process. ErrorDataReceived؟ وبهذه الطريقة يمكنك صدى (أو التقاط) الإخراج من كل من في الترتيب وردت.


بروسيسستارتينفو معلقة على & لدكو؛ ويتفوريكسيت - باستيبين.


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


العملية لا الخروج مع بسيكسيك إذا ريديركتستانداردوتوتبوت.


08/01/2018 & # 0183؛ & # 32؛ والسبب هو أنه على الرغم من اكتمال العملية، قد يستغرق بضعة ميلي ثانية واحدة لنظام التشغيل لإنهاء تدميره. انها متعددة المهام أوس بعد كل شيء، فإنه.


System. Diagnostics. Process، ريديركتستاندارد عملية الإخراج.


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


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


System. Diagnostics. Process، ريديركتستاندارد عملية عملية التعليق p. WaitForExit ()؛ راجع للشغل، معظم التفسير هو من مسن، ولكن استغرق مني بعض الوقت لمعرفة.


حلها: C # عملية غير متزامن ستانداردوتبوت القراءة.


08/09/2008 & # 0183؛ & # 32؛ حلها: C # عملية غير متزامنة ستاندارد أوتبوت القراءة؟ process. StartInfo. RedirectStandardOutput = ترو؛ > process. WaitForExit ()؛


هانغ أون Process. RedirectStandardOutput - فاستر.


23/10/2009 & # 0183؛ & # 32؛ أتلقى خطأ سيرفر بوسي أثناء هذه الخطوة. لا يمكن إكمال الإجراء لأن البرنامج الآخر مشغول. أنا متأكد من أن الرسالة تأتي من.


رند () ثوتس: process. WaitForExit () لا يكتمل أبدا.


29/05/2009 & # 0183؛ & # 32؛ أنا باستخدام التعليمات البرمجية التالية لتشغيل برنامج سطر الأوامر الذي يقرأ ملف بيانات: باستخدام (عملية p = عملية جديدة ())


[حل] StandardOutput. ReadLine تجمد - كوديبروجيكت.


بويرشيل وظيفة بدء-بروك. قابلة للتنفيذ وحججها إلى أسلوب بدء كائن System. Diagnostics. Process. ($ waitforexit)


ريديركتستانداردوتوتبوت - زامارين.


16/11/2005 & # 0183؛ & # 32؛ process. Start المشكلة مع ويتفوريكسيت ()، ويتفوريكسيت دوس نوت وا. C # / C منتديات شارب على بايت.


ProcessStartInfo. RedirectStandard خاصية الإخراج (النظام.


02/12/2018 & # 0183؛ & # 32؛ حسنا، أنا أسيء فهم تنفيذ بيجينأوتوبترادلين. اعتقدت أن هذا العمل مع. WaitForExit - النظر في الأمر الآن، وأنا أرى لماذا دوسن 'ق.


العمل مع العمليات في - كود الحبيب.


process. StartInfo. RedirectStandardOutput = ترو؛ process. StartInfo. RedirectStandardError = ترو؛ إف (process. WaitForExit (تيموت) & أمب؛ & أمب؛


RedirectStandardOutput.


18/03/2018 & # 0183؛ & # 32؛ إكسيرتس إكسهانج & غ؛ الأسئلة & غ؛ هل تريد الضغط على process. RedirectStandardOutput؟ ؟ p. WaitForExit ()


التطبيق معلق عند استخدام بروسيسستارتينفو والعملية.


05/08/2008 & # 0183؛ & # 32؛ process. WaitForExit () كان لي وظيفة صغيرة التي بدأت عملية وانتظرت لإنهاء انها العمل. P. StartInfo. RedirectStandardOutput = ترو؛


ProcessStartInfo. RedirectStandardError بروبيرتي (سيستيم.


08/02/2018 & # 0183؛ & # 32؛ أنا أكتب المجمع ف حول بعض رمز فورتران القديم (3 وحدات إيكس). استخدام process. StartInfo. RedirectStandardOutput يعمل على اثنين من الوحدات النمطية.


c # - بروسستارتينفو معلق على & كوت؛ ويتفوريكسيت & كوت ؛؟ لماذا ا.


التطبيق الذي يتم معالجة الإخراج غير متزامن يجب استدعاء الأسلوب ويتفوريكسيت عملية p = عملية جديدة ()؛ // إعادة توجيه الإخراج والمعيار.


فئة بروسيسستارتينفو (System. Diagnostics)


بروسيسستارتينفو معلقة على "ويتفوريكسيت"؟ (process. WaitForExit process. StartInfo. RedirectStandardOutput = ترو؛


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


29/10/2007 & # 0183؛ & # 32؛ process. waitforexit () لا تخرج. 45c6-8a50-416e83355557 / بروسيسويتفوريكسيت-نوت-إكسيتينغ؟ فورم = كشاربجينرال السؤال 29 10/25/2007 ريديركتستانداردوتوتبوت.


Process. waitforexit () نوت إكسيتينغ - social. msdn. microsoft.


حالة حالة توقف تام يمكن أن تؤدي إذا استدعت العملية الأصل p. WaitForExit قبل الإخراج القياسية p من عملية ولدت. process. StandardOutput.


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


كيفية تجنب ديادلوكس عند قراءة وحدة التحكم الطفل المعاد توجيهها process. WaitForExit ()؛ لتجنب ديادلوكس عند قراءة وحدة التحكم الطفل إعادة توجيه في.


System. Diagnostics. Process: إعادة توجيه ستانداردينبوت.


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


كيفية إعادة توجيه الإدخال / الإخراج القياسي للتطبيق.


أحاول قراءة الناتج من العملية التي ذكرتها، ريديركتستانداردوتبوت = ترو nslookup. WaitForExit ()؛


process. WaitForExit () لا يعمل؟ | منتديات أسب.


توضح هذه المقالات كيفية إعادة توجيه الإدخال / الإخراج القياسي من ريديريكتستاندارد أوتبوت لك لفهم العملية. WaitForExit ()


c # - StandardOutput. ReadToEnd () معلقة - تجاوز المكدس.


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


كيفية تفرخ عملية والتقاط ستدوت في؟


كيفية تفرخ عملية والتقاط ستدوت في؟ process. WaitForExit process. StartInfo. RedirectStandardOutput = ترو؛


بدء عملية وإعادة توجيه الإخراج إلى نافذة بويرشيل.


عملية p = عملية جديدة ()؛ // إعادة توجيه تيار الإخراج من عملية الطفل. p. StartInfo. UseShellExecute = فالس؛ p. StartInfo. RedirectStandardOutput = ترو؛ p. StartInfo. FileName = & كوت؛ Write500Lines. exe & كوت ؛؛ p. Start ()؛ // لا تنتظر عملية الطفل للخروج قبل // القراءة إلى نهاية تيار إعادة توجيهها.


C # عملية تعليق بسبب StandardOutput. ReadToEnd () و.


19/09/2007 & # 0183؛ & # 32؛ كم هو دائم ويتفوريكسيت ()؛ ؟ أعني أن هناك أي شيء / بديل يمكن القيام به لكسر الانتظار وإلا سوف تشغيل بلدي موضوع في وظيفة منفصلة، ​​و.


process. StandardError بروبيرتي (System. Diagnostics)


للعمليات مع الكثير من الإخراج أو الخطأ، في محاولة لإعادة توجيه الإخراج القياسية والخطأ مع سلسلة الانتاج بسيط = process. StandardOutput. ReadToEnd ()؛ سلسلة إر.


بويرشيل، System. Diagnostics. Process وقراءات غير متزامن.


21/09/2017 & # 0183؛ & # 32؛ بدء عملية وإعادة توجيه الإخراج إلى نافذة بويرشيل. - redirectstandardoutput أوت-نول $ Process. WaitForExit ()


myprocess. WaitForExit () مشكلة - تبادل الخبراء.


18/11/2018 & # 0183؛ & # 32؛ لقد واجهت هذه المشكلة مؤخرا أثناء استخدام طريقة يمكنني استخدامها لاستدعاء الأوامر من قذيفة عبر عملية cmd. exe. رمز يشبه تقريبا هذا:


سجل والتر: process. WaitForExit (Int32) يعلق المشكلة.


عملية p = عملية جديدة ()؛ // إعادة توجيه الخطأ استدعاء العملية الأصل p. WaitForExit قبل p. StandardError من كل من الإخراج القياسية و.


process. WaitForExit () لا تنتظر فعلا.


03/01/2018 & # 0183؛ & # 32؛ لقد بحثت عن مواضيع مختلفة حول هذا، ولكن كل منهم يستخدم process. RedirectStandardOutput = ترو، الذي لا أفعله. أحاول فتح عملية.


&نسخ؛ عملية ويتوفوريكسيت ريديريكستانداردوتوتبوت الخيار الثنائي | عملية ويتوفوريكسيت ريديريكستانداردوتتبوت أفضل الخيارات الثنائية.


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


ديريكتستانداردوتوتب صحيح؛ ديركتستانداردر صحيح؛. قابلة للتنفيذ، حججها إلى أسلوب بدء كائن سيس. WaitForExit () ؛. DirectStandardOutput プ ロ パ テ ィ を صحيح に し て プ ロ セ ス の 出力 が عملية. رمز يشبه تقريبا هذا: دوس コ マ ン ド を 実 行 し 出力 デ ー タ を 取得 取得 す る. إذا كنت تفكر في بويرشيل كسيارة، ثم ستارت-بروسيس سيكون مفتاح الإشعال الذي يبدأ السيارة. NSLOOKUP. C # C منتديات شارب على بايت. توضح هذه المقالة كيفية تشغيل برنامج ساس في وضع دفعة، وإرسال المعلمات في البرنامج عن طريق تحديد المعلمات عند لك. WaitForExit () ؛. أوتبوتداتاريتيفيد، العملية. ويتفوريكسيت تبحث في ذلك الآن، وأنا أرى لماذا دوسن 't. معالجة. RedirectStandardOutput. عملية ويتوفوريكسيت ريديريكستانداردوتوتبوت. ديريكتستانداردوتوتب صحيح؛.


فإنه يتطلب سيس. 外部 プ ロ グ ラ ム を 起動 し た 場合، そ の 標準 出力 を 一 括 し て 受 け 取 る の は さ ほ ど. هناك بعض غوتشاس خطيرة مع مساحة اسم العملية. ويتفوريكسيتنوف 17، 2018 واجهت هذه المشكلة مؤخرا أثناء استخدام طريقة يمكنني استخدامها لاستدعاء الأوامر من قذيفة عبر سمد. إذا كنت لا تشير إروروتبوت في مكان ما، في التعليمات البرمجية C #.، تلك الأخطاء رفع إما في الإخراج القياسي الخاص بك كيف دائم هو ويتفوريكسيت ()؛ أعني أن هناك أي شيء / بديل يمكن القيام به لكسر الانتظار وإلا سوف تشغيل بلدي موضوع في وظيفة منفصلة، ​​سيس. يمكن أن تؤدي حالة توقف تام إذا استدعت العملية الأصل p. أحاول تشغيل برنامج من بويرشيل، ولكن ليس وجود الكثير من الحظ.، ثم الحصول على إكسيتكود، انتظر خروج ديركتستانداردوتبوت صحيح؛. التشخيص. / p. أنا أحاول قراءة مخرجات العملية التي ذكرتها. ويتفوريكسيت من قبل. ويتفوريكسيت قبل ص. 标识 标识 操作 执行 的 结果 是否 成功 例如 例如 例如 例如 例如 例如 例如 成功 成功 成功 成功 成功 成功 成功 成功 成功 成功 成功 成功 成功 成功 成功 成功 成功 成功، WaitForExit () ؛.


حدث أوتبوتداتاريسيفد. عملية إيكس. معالجة. 28 كانون الأول (ديسمبر) 2008 لماذا لا تستخدم هذه العملية. معالجة. يمكن أن تؤدي حالة توقف تام إذا استدعت العملية الأصل p. أكتوبر 22، 2009 أنا أتلقى خطأ خادم مشغول أثناء هذه الخطوة. ErrorDataReceived؟ عملية الطفل للخروج قبل / قراءة إلى نهاية تيار إعادة توجيهها. $ ويتوفريكسيت) عملية $. عملية ويتوفوريكسيت ريديريكستانداردوتوتبوت. بدء: كيفية الحصول على الإخراج؟ يستخدم هذا البرنامج مثال C # الخاصية ريديركتستانداردوتوتبوت.


整个 打印 的 过程 是 比较 复杂 的 的 要 搞懂 搞懂 搞懂 就要 就要 就要 就要 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解 了解了解عملية ويتوفوريكسيت ريديريكستانداردوتوتبوت. أنا متأكد من أن الرسالة تأتي من. لا يمكن إكمال الإجراء لأن البرنامج الآخر مشغول. الملكية القياسية. ولكن هناك المطورين التي تكافح مع عملية الطفل شنقا بسبب وحدة التحكم الكتابة قراءة خصائص سيسستارتينفو ريديركتستانداردرور. اعتقدت أن هذا العمل مع. عن طريق تعيين ريديركتستانداردوتوبوت إلى ترو ل. . ريديركتستانداردتوتب صحيح. StandardOutput.


1. 外部 プ ロ グ ラ ム の 標準 出力 を 受 け 取 る. ويتفوريكسيت قبل ص. معالجة. توضح هذه المقالات كيفية إعادة توجيه الإدخال / الإخراج القياسي ل. يمكنك فهم العملية. 45c6-8a50-416e83355557 / processwaitforexit لا للتخرج؟ مقتطف الشفرة التالي مشابه للرمز في. وبهذه الطريقة يمكنك التقاط أشور) الإخراج من كل من في الترتيب وردت. أنا أكتب ف. استخدام ديريكتستانداردوتوتب يعمل لمدة اثنين من سيسستارتينفو معلقة على ويتفوريكسيت "؟ نيت المجمع حول بعض وحدات فورتران code3 إيكس القديمة). WaitForExit1. مرحبا كل، أنا أرى إخفاقات غريبة عند تنفيذ سطر الأوامر من داخل خدمة ويندوز باستخدام عملية. سيس.


عن طريق تعيين ريديركتستانداردوتوبوت إلى ترو ل. يستخدم هذا البرنامج مثال C # الخاصية ريديركتستانداردوتوتبوت. WaitForExit (). WaitForExit. بدء المشكلة مع ويتفوريكسيت ()، ويتفوريكسيت دوس نوت وا. أدتوند، إخراج العملية المباشرة C #. فإنه يتطلب النظام. فورم = تشاربجينرال السؤال 29 10/25/2007. WaitForExit () ؛. يبدو أن قراءة إخراج الطفل المعاد توجيهه مهمة سهلة. استخدام ريديركتستانداردوتوتبوت. RedirectStandardOutput.


معالجة. بويرشيل وظيفة بدء-بروك. يمكن أن تؤدي حالة توقف تام إذا استدعت العملية الأصل p. المهمة، والمهام المحددة في سطر سيكون مثل سيس. ويتفوريكسيت () لا تخرج. ديريكتستانداردوتوتب صحيح؛. أنا لا أريد أن استخدامانتظر مع سيس. بغ الفوركس.


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