بدء عملية ويتوفوريكسيت
بروسيسستارتينفو висит на & كوت؛ ويتفوريكسيت & كوت ؛؟ Зачем؟
У меня есть следующий код:
Я знаю، что результат процесса، который я запускаю، составляет около 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 для созданного приложения. عودة إلى الأعلى>
تحذير: تمت ترجمة هذه المقالة تلقائيا خصائص رقم الموضوع:
Это сообщение может быть устаревшим، но я узнал основную причину، по которой он обычно зависает، из-за для ريديركتستانداردوتوبوت или если у вас есть ريديركتستاندارديرور.
Поскольку выходные данные или данные об ошибках велики، это вызовет время зависания، поскольку оно все еще обрабатывается на неопределенный срок.
process. start ويتفوريكسيت
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
انتظر حتى تنتهي العملية.
لدي تطبيق الذي لا.
لبدء تطبيق آخر "أبك". أريد أن تنتظر حتى ينتهي هذا التطبيق (عملية يموت) ومواصلة تنفيذ بلدي. كيف يمكنني فعل ذلك؟
قد يكون هناك حالات متعددة من تطبيق "أبك" قيد التشغيل في نفس الوقت.
أعتقد أنك تريد هذا فقط:
راجع صفحة مسن للطريقة. كما أن لديها الزائد حيث يمكنك تحديد مهلة، لذلك كنت لا يحتمل أن تنتظر إلى الأبد.
استخدام Process. WaitForExit؟ أو الاشتراك في الحدث Process. Exited إذا كنت لا تريد حظر؟ إذا كان هذا لا يفعل ما تريد، يرجى تعطينا المزيد من المعلومات حول الاحتياجات الخاصة بك.
أفعل ما يلي في طلبي:
هناك بعض الميزات الإضافية التي قد تجدها مفيدة.
يمكنك استخدام الانتظار للخروج أو يمكنك التقاط الخاصية هاسكسيتد وتحديث واجهة المستخدم الخاصة بك للحفاظ على المستخدم "أبلغ" (إدارة التوقعات):
معالجة . طريقة ويتفوريكسيت (Int32)
تحتوي الوثائق المرجعية أبي على منزل جديد. انتقل إلى متصفح أبي على docs. microsoft للاطلاع على التجربة الجديدة.
يرشد مكون العملية إلى الانتظار لعدد الملي ثانية المحدد للعملية المقترنة للخروج.
الجمعية: النظام (في System. dll)
المعلمات.
مقدار الوقت، بالمللي ثانية، لانتظار انتهاء العملية المقترنة. الحد الأقصى هو أكبر قيمة ممكنة لعدد صحيح 32 بت، والذي يمثل اللانهاية لنظام التشغيل.
قيمة الإرجاع.
صحيح إذا خرجت العملية المرتبطة بها؛ خلاف ذلك، كاذبة.
تعذر الوصول إلى إعداد الانتظار.
لم يتم تعيين معرف العملية، ولا يمكن تحديد التعامل الذي يمكن تحديد الخاصية إد.
لا توجد عملية مقترنة كائن العملية هذه.
أنت تحاول الاتصال ويتفوريكسيت (Int32) لعملية قيد التشغيل على كمبيوتر بعيد. تتوفر هذه الطريقة فقط للعمليات التي يتم تشغيلها على الكمبيوتر المحلي.
ويتفوريكسيت (Int32) يجعل الانتظار مؤشر الترابط الحالي حتى ينتهي العملية المقترنة. وينبغي أن يسمى بعد أن يتم استدعاء جميع الطرق الأخرى على العملية. لتجنب حظر مؤشر الترابط الحالي، استخدم الحدث الذي تم الخروج منه.
تقوم هذه الطريقة بتوجيه مكون العملية لانتظار مقدار محدود من الوقت لإنهاء العملية. إذا لم يتم إنهاء العملية المقترنة بنهاية الفترة الزمنية بسبب رفض طلب الإنهاء، يتم إرجاع فالس إلى إجراء الاستدعاء. يمكنك تحديد رقم سلبي (لانهائي) لميلي ثانية، وعملية. سوف يتصرف ويتفوريكسيت (Int32) نفس الزائد ويتفوريكسيت (). إذا قمت بتمرير 0 (صفر) إلى الأسلوب، فإنه يرجع صحيح فقط إذا كانت العملية قد خرجت بالفعل؛ وإلا فإنه يعود فورا كاذبة.
في الإطار 3.5 والإصدارات السابقة، إذا كان ميلي ثانية واحدة -1، انتظر التحميل الزائد ويتفوريكسيت (Int32) ل ماكسفالو ميلي ثانية (حوالي 24 يوما)، وليس إلى أجل غير مسمى.
عند إعادة توجيه الإخراج القياسي إلى معالجات أحداث غير متزامنة، فمن الممكن أن معالجة الإخراج لم تكتمل عند إرجاع هذه الطريقة. لضمان اكتمال معالجة الحدث غير المتزامن استدعاء الزائد ويتفوريكسيت () الذي لا يأخذ أي معلمة بعد تلقي صحيح من هذا التحميل الزائد. للمساعدة في ضمان التعامل مع الحدث الذي تم الخروج منه بشكل صحيح في تطبيقات نماذج ويندوز، قم بتعيين الخاصية سينكرونيزينغوبجيكت.
عند إنهاء عملية مقترنة (يتم إيقاف تشغيلها بواسطة نظام التشغيل من خلال إنهاء عادي أو غير طبيعي)، يخزن النظام المعلومات الإدارية حول العملية ويعود إلى المكون الذي كان يسمى ويتفوريكسيت (Int32). يمكن لمكون العملية ثم الوصول إلى المعلومات، والتي تتضمن إكسيتيمي، باستخدام مقبض إلى العملية خرجت.
لأن العملية المرتبطة قد خرجت، الخاصية مقبض المكون لم يعد يشير إلى مورد عملية موجود. بدلا من ذلك، يمكن استخدام المقبض فقط للوصول إلى معلومات نظام التشغيل حول مورد العملية. النظام على بينة من مقابض للخروج من العمليات التي لم يتم إصدارها من قبل مكونات العملية، لذلك فإنه يحتفظ إكسيتيمي والتعامل مع المعلومات في الذاكرة حتى يقوم مكون العملية بتحرير الموارد على وجه التحديد. لهذا السبب، في أي وقت استدعاء بدء تشغيل مثيل عملية استدعاء إغلاق عند انتهاء العملية المقترنة ولم تعد بحاجة إلى أية معلومات إدارية حول هذا الموضوع. إغلاق يحرر الذاكرة المخصصة لعملية خرجت.
راجع مثال التعليمات البرمجية الخاصية إكسيتكود.
للحصول على الثقة الكاملة للمتصل الفوري. لا يمكن استخدام هذا العضو من خلال شفرة موثوق بها جزئيا.
Метод العملية. ويتفوريكسيت ()
Опубликовано: Октябрь 2018.
Дает компоненту بروسيس команду ожидать завершения связанного процесса в течение неограниченного времени.
Нет доступа к параметру ожидания.
Не задан إد процесса، и هاندل، из которого можно определить свойство إد، не существует.
С этим объектом بروسيس никакие процессы не связаны.
Вы пытаетесь вызвать метод ويتفوريكسيت () для процесса، выполняющегося на удаленном компьютере. Этот метод доступен только для процессов، запущенных на локальном компьютере.
ويتفوريكسيت () يجعل الانتظار مؤشر الترابط الحالي حتى ينتهي العملية المقترنة. وينبغي أن يسمى بعد أن يتم استدعاء جميع الطرق الأخرى على العملية. لتجنب حظر مؤشر الترابط الحالي، استخدم الحدث الذي تم الخروج منه.
تقوم هذه الطريقة بإرشاد المكون T: System. Diagnostics. Process إلى الانتظار لوقت غير محدود من الوقت لمعالجة العملية ومعالجات الأحداث. قد يؤدي هذا إلى توقف التطبيق عن الاستجابة. على سبيل المثال، إذا قمت بالاتصال M: System. Diagnostics. Process. CloseMainWindow لعملية تحتوي على واجهة مستخدم، قد لا يتم التعامل مع الطلب إلى نظام التشغيل إنهاء العملية المقترنة إذا تمت كتابة العملية عدم إدخال حلقة رسالة .
في net_v35_long والإصدارات السابقة، انتظر M: System. Diagnostics. Process. WaitForExit الزائد ل F: System. Int32.MaxValue ميلي ثانية (حوالي 24 يوما)، وليس إلى أجل غير مسمى. أيضا، الإصدارات السابقة لم تنتظر معالجات الحدث للخروج إذا تم الوصول الكامل F: System. Int32.MaxValue الوقت.
يضمن هذا التحميل الزائد أن جميع عمليات المعالجة قد اكتملت، بما في ذلك التعامل مع الأحداث غير المتزامنة للإخراج القياسي المعاد توجيهه. يجب استخدام هذا التحميل الزائد بعد إجراء مكالمة إلى M: System. Diagnostics. Process. WaitForExit (System. Int32) الزائد عند إعادة توجيه الإخراج القياسي إلى معالجات الأحداث غير المتزامنة.
عند إنهاء عملية مقترنة (أي عندما يتم إيقاف تشغيله بواسطة نظام التشغيل من خلال إنهاء عادي أو غير طبيعي)، يخزن النظام المعلومات الإدارية حول العملية ويعود إلى المكون الذي كان يسمى M: System. Diagnostics. Process. WaitForExit. المكون T: System. Diagnostics. Process يمكن ثم الوصول إلى المعلومات، والذي يتضمن P: System. Diagnostics. Process. ExitTime، وذلك باستخدام P: System. Diagnostics. Process. Handle إلى عملية خرجت.
لأن العملية المرتبطة قد خرجت، الخاصية P: System. Diagnostics. Process. Handle المكون لم يعد يشير إلى مورد عملية موجود. بدلا من ذلك، يمكن استخدام المقبض فقط للوصول إلى معلومات نظام التشغيل حول مورد العملية. النظام على بينة من مقابض للخروج من العمليات التي لم يتم الافراج عنهم من قبل مكونات T: System. Diagnostics. Process، لذلك يحافظ على P: System. Diagnostics. Process. ExitTime و P: System. Diagnostics. Process. Handle المعلومات في الذاكرة حتى T: System. Diagnostics. Process مكون يحرر على وجه التحديد الموارد. لهذا السبب، في أي وقت استدعاء M: System. Diagnostics. Process. Start ل T: System. Diagnostics. Process مثيل، استدعاء M: System. Diagnostics. Process. Close عند إنهاء العملية المرتبطة وكنت لم تعد بحاجة إلى أي المعلومات الإدارية حول هذا الموضوع. M: System. Diagnostics. Process. Close يحرر الذاكرة المخصصة لعملية خرجت.
راجع قسم الملاحظات من الصفحة المرجعية P: System. Diagnostics. Process. StandardError.
للحصول على الثقة الكاملة للمتصل الفوري. لا يمكن استخدام هذا العضو من خلال شفرة موثوق بها جزئيا.
Метод العملية. ويتفوريكسيت (Int32)
Опубликовано: Октябрь 2018.
Дает компоненту بروسيس команду ожидать завершения связанного процесса в течение указанного времени в миллисекундах.
Количество времени в миллисекундах для ожидания завершения связанного процесса. Максимальным является наибольшее возможное 32-битное целое число، которое представляет для операционной системы бесконечность.
Возвращаемое значение.
Значение ترو، если связанный процесс завершился؛ в противном случае - значение فالس.
Нет доступа к параметру ожидания.
Не задан إد процесса، и هاندل، из которого можно определить свойство إد، не существует.
С этим объектом بروسيس никакие процессы не связаны.
Вы пытаетесь вызвать метод ويتفوريكسيت (Int32) для процесса، запущенного на удаленном компьютере. Этот метод доступен только для процессов، запущенных на локальном компьютере.
ويتفوريكسيت (Int32) يجعل الانتظار مؤشر الترابط الحالي حتى ينتهي العملية المقترنة. وينبغي أن يسمى بعد أن يتم استدعاء جميع الطرق الأخرى على العملية. لتجنب حظر مؤشر الترابط الحالي، استخدم الحدث الذي تم الخروج منه.
تقوم هذه الطريقة بإرشاد المكون T: System. Diagnostics. Process إلى الانتظار لفترة محدودة من الوقت للخروج من العملية. إذا لم يتم إنهاء العملية المقترنة بنهاية الفترة الزمنية بسبب رفض طلب الإنهاء، يتم إرجاع فالس إلى إجراء الاستدعاء. يمكنك تحديد رقم سالب (F: System. Threading. Timeout. Infinite) للملي ثانية، و M: System. Diagnostics. Process. WaitForExit (System. Int32) سوف تتصرف نفس M: System. Diagnostics. Process. WaitForExit الزائد. إذا قمت بتمرير 0 (صفر) إلى الأسلوب، فإنه يرجع صحيح فقط إذا كانت العملية قد خرجت بالفعل؛ وإلا فإنه يعود فورا كاذبة.
في net_v35_long والإصدارات السابقة، إذا كان ميلي ثانية واحدة -1، ينتظر الزائد M: System. Diagnostics. Process. WaitForExit (System. Int32) ل F: System. Int32.MaxValue ميلي ثانية (حوالي 24 يوما)، وليس إلى أجل غير مسمى.
عند إعادة توجيه الإخراج القياسي إلى معالجات أحداث غير متزامنة، فمن الممكن أن معالجة الإخراج لم تكتمل عند إرجاع هذه الطريقة. لضمان اكتمال معالجة الحدث غير المتزامن استدعاء M: System. Diagnostics. Process. WaitForExit الزائد الذي يأخذ أي معلمة بعد تلقي صحيح من هذا التحميل الزائد. للمساعدة في ضمان التعامل مع الحدث E: System. Diagnostics. Process. Exited بشكل صحيح في تطبيقات ويندوز فورمز، تعيين الخاصية P: System. Diagnostics. Process. SynchronizingObject.
عند خروج عملية مقترنة (يتم إيقاف تشغيلها بواسطة نظام التشغيل من خلال إنهاء عادي أو غير طبيعي)، يقوم النظام بتخزين المعلومات الإدارية حول العملية والعودة إلى المكون الذي كان يسمى M: System. Diagnostics. Process. WaitForExit (System. Int32 ). المكون T: System. Diagnostics. Process يمكن ثم الوصول إلى المعلومات، والذي يتضمن P: System. Diagnostics. Process. ExitTime، وذلك باستخدام P: System. Diagnostics. Process. Handle إلى عملية خرجت.
لأن العملية المرتبطة قد خرجت، الخاصية P: System. Diagnostics. Process. Handle المكون لم يعد يشير إلى مورد عملية موجود. بدلا من ذلك، يمكن استخدام المقبض فقط للوصول إلى معلومات نظام التشغيل حول مورد العملية. النظام على بينة من مقابض للخروج من العمليات التي لم يتم الافراج عنهم من قبل مكونات T: System. Diagnostics. Process، لذلك يحافظ على P: System. Diagnostics. Process. ExitTime و P: System. Diagnostics. Process. Handle المعلومات في الذاكرة حتى T: System. Diagnostics. Process مكون يحرر على وجه التحديد الموارد. لهذا السبب، في أي وقت استدعاء M: System. Diagnostics. Process. Start ل T: System. Diagnostics. Process مثيل، استدعاء M: System. Diagnostics. Process. Close عند إنهاء العملية المرتبطة وكنت لم تعد بحاجة إلى أي المعلومات الإدارية حول هذا الموضوع. M: System. Diagnostics. Process. Close يحرر الذاكرة المخصصة لعملية خرجت.
راجع المثال التعليمات البرمجية الخاصية P: System. Diagnostics. Process. ExitCode.
للحصول على الثقة الكاملة للمتصل الفوري. لا يمكن استخدام هذا العضو من خلال شفرة موثوق بها جزئيا.
Comments
Post a Comment