قراءة ستانداردوتبوت ويتفوريكسيت
بروسيسستارتينفو висит на & كوت؛ ويتفوريكسيت & كوت ؛؟ Зачем؟
У меня есть следующий код:
Я знаю، что результат процесса، который я запускаю، составляет около 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 для созданного приложения. عودة إلى الأعلى>
تحذير: تمت ترجمة هذه المقالة تلقائيا خصائص رقم الموضوع:
Это сообщение может быть устаревшим، но я узнал основную причину، по которой он обычно зависает، из-за для ريديركتستانداردوتوبوت или если у вас есть ريديركتستاندارديرور.
Поскольку выходные данные или данные об ошибках велики، это вызовет время зависания، поскольку оно все еще обрабатывается на неопределенный срок.
يقرأ ستانداردوتبوت ويتفوريكسيت
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
ستانداردOutput. ReadToEnd () معلقة [مكررة]
هذا السؤال له إجابة هنا:
لدي برنامج يستخدم في كثير من الأحيان برنامج خارجي ويقرأ مخرجاته. أنه يعمل بشكل جيد جدا باستخدام العملية المعتادة إعادة توجيه الإخراج الخاص بك، ولكن واحدة حجة محددة لسبب ما تعليق عندما أحاول قراءته، أي رسالة خطأ - لا استثناء، انها مجرد 'توقف' عندما تصل إلى هذا الخط. أنا بالطبع استخدام وظيفة مركزية للاتصال وقراءة الإخراج من البرنامج، وهذا هو:
الخط الذي يعلق هو ريسولت = proc. StandardOutput. ReadToEnd ()؛ ، ولكن مرة أخرى، وليس في كل مرة، إلا عندما أرسلت حجة محددة ("بدء الخادم"). تعمل جميع الوسيطات الأخرى على ما يرام - فهي تقرأ القيمة وترجعها. انها أيضا غريبة الطريقة التي يتعطل. فإنه لا تجميد أو إعطاء خطأ أو أي شيء، فإنه يتوقف فقط معالجة. كما لو كان الأمر 'العودة'، إلا أنها لا تعود حتى إلى وظيفة الدعوة، فإنه يتوقف فقط كل شيء مع واجهة لا تزال قائمة وتشغيلها. أي شخص واجه هذا من قبل؟ أي شخص لديه أي فكرة ما يجب أن أحاول؟ أنا أفترض أنه شيء غير متوقع داخل التيار نفسه، ولكن هل هناك طريقة يمكنني التعامل معها / تجاهل هذا بحيث يقرأها على أي حال؟
تم وضع علامة عليه كنسخ من قبل بيتر دونيهو c # يمكن للمستخدمين مع شارة C # إغلاق بمفرده C # الأسئلة كما مكررة وإعادة فتح لهم حسب الحاجة. 27 يونيو في الساعة 2:45.
وقد طرح هذا السؤال من قبل، ولديه بالفعل جواب. إذا كانت هذه الإجابات لا تعالج سؤالك بشكل كامل، فيرجى طرح سؤال جديد.
الحلول المقترحة مع بيجينأوتوبترادلين () هي وسيلة جيدة ولكن في حالات مثل هذا، فإنه لا ينطبق، لأن العملية (بالتأكيد مع استخدام ويتفوريكسيت ()) مخارج في وقت سابق من الناتج غير المتزامن الانتهاء تماما.
لذلك، حاولت تنفيذها بشكل متزامن وجدت أن الحل هو في استخدام طريقة نظرة خاطفة () من فئة ستريمريدر. لقد أضفت التحقق من بيك () & غ؛ -1 للتأكد من أنه ليس نهاية تيار كما هو الحال في مقالة مسن وصفها وأخيرا أنه يعمل ووقف شنقا!
إليك الرمز:
المشكلة هي أنك تستخدم أساليب ريادتويند متزامنة على كل من ستانداردوتبوت وتيار ستانداردرور. هذا يمكن أن يؤدي إلى الجمود المحتمل كنت تعاني. يتم وصف هذا حتى في مسن. ويرد وصف الحل هناك. في الأساس، هو: استخدام الإصدار غير متزامن بيجينأوتوبترادلين لقراءة البيانات من تيار ستانداردوتبوت:
ماذا عن شيء مثل:
لقد واجهت نفس المشكلة في طريق الجمود. هذا مقتطف الشفرة عملت بالنسبة لي.
كان لي نفس النوع من المشكلة أن الخطأ كان مجرد شنقا.
بناء على ردكم على دانيال هيلغارث لم أكن حتى محاولة استخدام تلك الرموز على الرغم من أنني أعتقد أنها قد عملت بالنسبة لي.
منذ أريد أن أكون قادرة على القيام ببعض الانتاج مربي الحيوانات لا يزال في نهاية المطاف قررت أن أفعل ذلك مع كل من النواتج التي يتم القيام بها في موضوع الخلفية.
هذا عملت بالنسبة لي وسمح لي أن لا تضطر إلى استخدام مهلة للقراءة.
شيء أنيق وعملت بالنسبة لي هو:
هذه الإجابة وجدت هنا وخدعة يستخدم فلوش () وإغلاق () على المدخلات القياسية.
حل الإجابة المقبولة لم ينجح بالنسبة لي. اضطررت إلى استخدام المهام من أجل تجنب الجمود:
مع وظيفة جيتستريموتبوت على النحو التالي:
فقط في حالة شخص يتعثر على هذا السؤال في حين ويلينغ لاستخدام نماذج ويندوز و تكستبوكس (أو ريتكستبوكس) لإظهار الأخطاء والمخرجات العملية يعود في الوقت الحقيقي (كما هي مكتوبة إلى process. StandardOutput / process. StandardError).
تحتاج إلى استخدام أوتبوتداتاريسيفد () / إرورداتاريسيفد () لقراءة كل من تيارات دون ديادلوكس، ليس هناك طريقة (بقدر ما أعرف) لتجنب ديادلوكس خلاف ذلك، حتى فيدور الجواب، الذي يحمل الآن "الإجابة" العلامة و معظم يحب حتى الآن، لا تفعل خدعة بالنسبة لي.
ومع ذلك، عند استخدام ريتكتكستبوكس (أو مربع نص) لإخراج البيانات، مشكلة أخرى واجهتها هي كيفية كتابة البيانات في الواقع في مربع النص في الوقت الحقيقي (بمجرد وصولها). تتلقى الوصول إلى البيانات داخل واحد من المواضيع الخلفية أوتبوتداتاريفيسد () / إرورداتاريفسد () ويمكنك فقط أبندتكست () من مؤشر الترابط الرئيسي.
ما حاولت القيام به أولا كان استدعاء process. Start () من مؤشر ترابط الخلفية ثم استدعاء بيجينفوك () = & غ؛ أبندتكست () في أوتبوتداتاريسيفد () / إرورداتاريفيسد () المواضيع بينما كان مؤشر الترابط الرئيسي process. WaitForExit ().
ومع ذلك، أدى هذا إلى شكل بلدي تجميد وفي نهاية المطاف معلقة للأبدية. بعد بضعة أيام من المحاولة انتهى بي الأمر مع الحل أدناه، وهذا يبدو أن تعمل بشكل جيد للغاية.
في وقت قصير، تحتاج إلى إضافة الرسائل إلى مجموعة متزامنة داخل أوتبوتداتاريفيسيون () / إرورداتاريفيسد () المواضيع في حين أن مؤشر الترابط الرئيسي يجب أن تحاول باستمرار لاستخراج الرسائل من تلك المجموعة وإلحاقها في مربع النص:
C # اليوم.
السماح C # اليوم!
السماح C # اليوم!
كيفية تجنب ديادلوكس عند قراءة وحدة التحكم الطفل المعاد توجيهها في C # 2.
يبدو أن قراءة إخراج الطفل المعاد توجيهه مهمة سهلة. ولكن هناك المطورين أن النضال مع عملية الطفل شنقا بسبب وحدة التحكم كتابة / قراءة ديادلوكس. و ديادلوكس ليس من السهل التحقيق.
دعونا ننظر في مثال شائع - عملية الأم تبدأ عملية الطفل ويقرأ كل الإخراج. هنا مثال على التطبيق الذي يمكن محاكاة السيناريو.
يمكن تشغيل التطبيق في وضعين:
العملية الأم - ينفذ عملية الطفل ويقرأ إنتاجها عملية الطفل - يطبع بعض الإخراج.
كل شيء يعمل بشكل جيد، ولكن دعونا ننظر في السيناريو حيث الإخراج الطفل هو ذات مغزى أكبر.
هذه المرة العملية الأم سوف يتعطل - انها مأزق. لماذا ا؟ دعونا نفكر ما يفعله الوالد - أولا إعداد الطفل عملية إخراج الإخراج.
بعد ذلك يبدأ عملية الطفل.
خطوة متتالية ينتظر عملية الطفل لإنهاء.
وهذه هي النقطة التي تكون فيها عملية الوالد الأم مع الطفل. لماذا ا؟ الوالد ينتظر أن ينتهي الطفل ويكون للطفل بعض التبعية على الوالد أيضا.
أولا، تحتاج إلى فهم كيفية عمل إعادة توجيه الإخراج. هناك المخزن المؤقت التي تم إنشاؤها للإخراج. عندما يكتب الطفل إلى وحدة التحكم فإنه في الواقع الكتابة إلى المخزن المؤقت. إذا كان الطفل يكتب الكثير المخزن المؤقت قد تحصل على كامل. في مثل هذه الحالة يعلق الطفل على Console. Write حتى يحصل على المخزن المؤقت بعض المساحة.
يجب على الوالد قراءة ناتج الطفل قبل انتظاره حتى ينتهي الطفل. لذلك لإصلاح الجمود علينا أن مبادلة الخطوط التالية.
يجب أن يكون رمز الوالد الكامل كما يلي.
يرجى ملاحظة أن بالضبط نفس المشكلة قد يحدث مع الإخراج الخطأ القياسية (ستدير). بالإضافة إلى ذلك قد تحدث حالة توقف تام مماثلة مع الكتابة إلى الإدخال القياسي للطفل & # 8217؛ s.
في الأساس تحتاج إلى أن تكون حذرا جدا وفهم ما كنت & # 8217؛ القيام به إذا كنت ترغب في قراءة الطفل & # 8217؛ ق الإدخال / الإخراج بطريقة متزامنة.
ترك تعليق إلغاء الرد.
2 أفكار حول & لدكو؛ كيفية تجنب ديادلوكس عند قراءة وحدة التحكم الطفل المعاد توجيهها في C # & رديقو؛
وون & # 8217؛ ر هذا الجمود لا يزال إذا كانت العملية تنتج كثيرا على ستدير؟ أعتقد أن تكون آمنة حقا لديك لاستخدام الأحداث بدلا من ذلك.
صحيح، لقد أضفت ملاحظة حول ستدير.
أوافق على أن التعامل غير المتزامن هو طريقة أكثر أمنا. أنا & # 8217؛ ليرة لبنانية إرسال مشاركة حول هذا الموضوع كذلك.
كود الحبيب.
مدونة للمدربين من قبل المبرمجين.
العمل مع العمليات في.
وغالبا ما يتم بناء لغات البرمجة والصدفة حول القدرة على عملية واحدة لإطلاق بسهولة والعمل مع نتائج الآخرين. هذا هو الأسلوب الأساسي للتجهيز في باش، في حين يدعم الياقوت 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 هو طول سلسلة البحث.
Первичная навигация.
Форум только для чтения.
أنت غير متصل حاليا، Новые беседы или комментарии не могут быть добавлены.
معالجة العملية عند تنفيذ أي أمر باستخدام & # 160؛ process. Start ()
لأنه إذا كان بروسيس. ستارت () سوف تنجح ثم أستطيع الحصول على استجواب الإخراج.
لا يحتوي ماناجيمباسوبجيكت التي تم إرجاعها بواسطة إنفوكيميثود ريتورند الفعلي الناتج عن العملية.
وأعتقد أنه قد يكون مرتبطا بإعادة توجيه الإخراج / الخطأ. ويتم ذلك بشكل متزامن، بحيث يمكنك لا يمكن إعادة توجيه كل منهما في نفس الوقت. للقيام بذلك، يجب أن يتم ذلك بشكل غير متزامن. (بيجينأوتوبترادلين، بيجينيرورادلين)
& كوت؛ يتجنب المثال التعليمات البرمجية حالة حالة توقف تام عن طريق تنفيذ عمليات قراءة غير متزامنة على تيار ستانداردوتبوت. حالة حالة توقف تام إذا استدعت العملية الأصل p. StandardOutput. ReadToEnd متبوعا ب p. StandardError. ReadToEnd والكتابة عملية يكتب ما يكفي من النص لملء تيار الخطأ. سوف تنتظر العملية الأم إلى أجل غير مسمى لعملية الطفل لإغلاق تيار ستاندارد أوتبوت. سوف تنتظر عملية الطفل إلى أجل غير مسمى للوالد لقراءة من تيار ستاندارديرور الكامل.
يمكنك استخدام عمليات القراءة غير المتزامنة لتجنب هذه التبعيات وإمكانية الجمود. بدلا من ذلك، يمكنك تجنب حالة الجمود عن طريق إنشاء اثنين من مؤشرات الترابط وقراءة الإخراج من كل تيار على مؤشر ترابط منفصل. & كوت؛
ورل تحت VS2005 الوثائق:
هل سبق لك أن أحسبت هذه المشكلة؟ أنا أميل إلى التفكير في خلل في الاشياء الانتحال في 2.0. إذا قمت بإزالة انتحال الهوية وهذا يعمل بشكل جيد. حتى إعادة توجيه الإخراج والخطأ. ولكن في الدقيقة التي تحاول تشغيل العملية كمستخدم آخر تبدأ العملية، ولكن بعد ذلك توقف. أود أن أقول الأمن إلا أن هناك خطأ في حد ذاته. عملية ينطلق بشكل جيد ولكن بعد ذلك يتوقف فقط. إذا كان الأمن كنت أعتقد أنك لن تبدأ حتى بدء العملية. كما أنها مثيرة للاهتمام لأن المشكلة تتالي أيضا من خلال العمليات. على سبيل المثال، حاولت التفاف مكالمة انتحال الهوية في إيكس آخر حتى أتمكن من بدء البرنامج الأولي (من أسب) مع عدم انتحال الهوية. نفس الشيء يحدث. توقف العملية. وليس عملية المجمع. عملية داخل المجمع الذي يجري انتحال معلقة! مجنون. إذا قمت بتشغيل إيكس المجمع كما أي مستخدم أنه يعمل على ما يرام كذلك حتى أعرف أن المجمع يعمل في كل سياق آخر غير أسب.
هل وجد أي شخص حلا لهذه المشكلة؟
وإليك واحد يعمل في وضع التصحيح في أسب (2.xxx)،
ولكن لا يعمل في وضع منشور: مساعدة!
الطبقة العامة ميكلاس.
السلسلة العامة ستربالانس = string. Empty؛
سلسلة خاصة رونبروك (سلسلة الأحرف)
بروسيس بروك = نيو بروسيس ()؛
سترينغ باسوردبري = & كوت؛ ميباسورد & كوت ؛؛
شار [] باسوردشارس = passwordPre. ToCharArray ()؛
سيكوريسترينغ باسورد = نيو سيكوريسترينغ ()؛
فوريش (شار c في باسوردشارز)
عودة ستربالانس؛ // أنا لم تحصل هنا في نشر، أعمل في التصحيح.
ستربالانس & # 43؛ = e. Data؛ ؛ // أنا لم تحصل هنا في نشر، أعمل في التصحيح.
Беседа заблокирована.
Администраторы заблокировали эту беседу. Новые комментарии не могут быть добавлены.
© Майкрософт (ميكروسوفت)، 2018. Корпорация ميكروسوفت сохраняет за собой все права، связанные с материалами на этом сайте.
Comments
Post a Comment