Thursday 22 March 2018

عملية ويتفوريكسيت لا تنتظر


process. waitforexit لا تنتظر
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
لماذا process. WaitForExit لا ينتظر؟
لماذا process. WaitForExit لا تنتظر؟
فإنه يحتفظ حلقات وبدء التطبيق مرارا وتكرارا!
عملت الآن، لم يكن يعمل لأنه كان مثل هذا clsProcess. WaitForExit (1000).
يتم لف هذا الرمز في حين (صحيح) حلقة وليس هناك كسر، رمي أو عودة البيانات داخل الجسم من حلقة. وسوف يؤدي في الواقع إلى حلقة لانهائية.
إذا كنت ترغب في الخروج من حلقة بمجرد الانتهاء من ويتفوريكسيت ثم تحتاج إلى تقديم بيان استراحة للقيام بذلك.
تحقق من أنه في حالة عدم عرض (process. GetProcessesByName ("سيرفيرابفيلماناجر"). الطول & غ؛ 0) خطأ.
حسنا، هذا هو الطريقة التي ترميز ذلك. انها تنتظر الخروج، ثم في البيان التالي إذا كان يبدأ مرة أخرى. وكما أشار جاريد إلى أنه يحافظ على حلقات دون أي وسيلة للخروج. لذلك فإنه يبدأ، ينتظر لذلك للخروج، ومن ثم يبدأ مرة أخرى.

process. waitforexit لا تنتظر
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
process. WaitForExit لا يعود على الرغم من أن process. HasExited صحيح.
ابدأ استخدام process. Start لبدء ملف دفعي. يستخدم ملف الدفعي الأمر "ستارت" لبدء عدة برامج بالتوازي ثم الخروج.
بمجرد الانتهاء من ملف الدفعي يصبح process. HasExited ترو و process. ExitCode يحتوي على رمز الخروج الصحيح.
ولكن عندما أدعو process. WaitForExit () أنه يتعطل / أبدا يعود.
الجزء التالي من التعليمات البرمجية يوضح المشكلة. فإنه يخلق ملف دفعي، يبدأ ثم ثم يطبع:
وينبغي بعد ذلك طباعة:
. لكنه لا يفعل (على الرغم من هاسكسيتد صحيح ولدينا بالفعل إكسيتكود).
لاحظت أن هذا يحدث فقط عندما يحتوي ملف الدفعي على أوامر "ستارت" وعند إعادة توجيه الإخراج القياسي و / أو الخطأ القياسي.
لماذا لا يتم إرجاع ويتفوريكسيت () أبدا؟
ما هي الطريقة الصحيحة للخروج من هذه العملية للخروج؟
هل هي آمنة لعملية الاستطلاع فقط. هاسيكسيتد أو يمكن أن يؤدي إلى مشاكل أخرى؟
بس: لقد لاحظت فقط أن استدعاء ويتفوريكسيت (100000) مع مهلة ضخمة (التي لا تنتهي بالتأكيد) يعود على الفور عند خروج العملية. غريب. دون مهلة أنها معلقة.
ويبدو أن هذا هو قطعة أثرية (أود أن أقول "علة") في التنفيذ المحدد للمعالجة غير المتزامن القائم على الحدث من ستانداردوتبوت و ستانداردرور.
لاحظت أنه في حين كنت قادرا على إعادة إنتاج المشكلة بسهولة، ببساطة عن طريق تشغيل التعليمات البرمجية التي قدمتها (مثال رمز ممتاز، بالمناسبة! :))، فإن العملية لم تتوقف في الواقع إلى أجل غير مسمى. بدلا من ذلك، عاد من ويتفوريكسيت () مرة واحدة كل من العمليات الطفل التي بدأت قد خرجوا أنفسهم.
ويبدو أن هذا جزء متعمد من تنفيذ فئة العملية. على وجه الخصوص، في طريقة Process. WaitForExit ()، بمجرد الانتهاء من الانتظار على مقبض العملية نفسها، فإنه يتحقق لمعرفة ما إذا كان قد تم إنشاء قارئ إما ستدوت أو ستدر؛ إذا كان الأمر كذلك، وإذا كانت قيمة المهلة للمكالمة ويتفوريكسيت () هي "لانهائية" (أي -1)، فإن المدونة تنتظر فعلا نهاية البث على القارئ (ق).
يتم إنشاء كل قارئ منها فقط عندما يتم استدعاء الأسلوب بيجينوتبترادلين () أو بيجينيرورادلين (). و ستدوت والجداول ستدير هي نفسها ليست مغلقة حتى أغلقت عمليات الطفل. حتى الانتظار في نهاية تلك الجداول سوف كتلة حتى يحدث ذلك.
أن يتفوريكسيت () يجب أن تتصرف بشكل مختلف اعتمادا على ما إذا كان أحد قد دعا إما من الأساليب التي تبدأ القراءة القائم على الحدث من تيارات أم لا، وخصوصا بالنظر إلى أن قراءة تلك التدفقات مباشرة لا يسبب ويتفوريكسيت () على التصرف بهذه الطريقة، يخلق عدم الاتساق في أبي الذي يجعل من الصعب فهمها واستخدامها. في حين أنني شخصيا استدعاء هذا الخلل، وأعتقد أنه من الممكن أن منفذي (ق) من الطبقة العملية على بينة من هذا التناقض وخلقها عن قصد.
في أي حال، فإن العمل حول سيكون لقراءة ستانداردوتبوت و ستانداردورور مباشرة بدلا من استخدام جزء الحدث القائم على أبي. (على الرغم من بطبيعة الحال، إذا كان رمز واحد ينتظر على تلك الجداول، واحد سوف يرى نفس السلوك حظر حتى الطفل يعالج وثيقة.)
على سبيل المثال (C #، لأنني لا أعرف F # جيدا بما يكفي لصفعة مثال رمز مثل هذا معا بسرعة :)):
نأمل أن العمل أعلاه أو حول شيء مماثل سوف تعالج المسألة الأساسية التي واجهت. شكرنا للمعلق نيلز فورغارد كريستنسن لتوجيهي إلى خطوط إشكالية في طريقة ويتفوريكسيت ()، حتى أتمكن من تحسين هذه الإجابة.

process. waitforexit لا تنتظر
أنا أكتب برنامج يبدأ عدد غير معروف من العمليات في تسلسل باستخدام myProcess. Start () و myProcess. WaitForExit ().
ويبدو أن المشكلة أن بعض العمليات قد تبدأ عمليات أخرى ومن ثم الخروج، مما تسبب في برنامجي لمواصلة دون العملية التي بدأت في الواقع الانتهاء من المهمة. هل هناك أي طريقة لمراقبة هذه & كوت؛ العمليات الفرعية & كوت ؛؟
شكرا مقدما.
تحرير: بعد بعض الاختبارات الإضافية اكتشفت أن نفس المشكلة تحدث عندما على سبيل المثال بدء تشغيل Winword. exe. ببساطة ويتفوريكسيت لا يعمل مع بعض التطبيقات.
كتب توم عن نفس المشكلة في هذا الموضوع.
لكنه كان راضيا عندما عملت على جهاز كمبيوتر مختلف.
يبدو أن & كوت؛ WINWORD. EXE & كوت؛ - process قيد التشغيل بالفعل على جهازي. ربما لأنني استخدام ورد كمحرر (؟). إغلاق هذا قبل تشغيل برنامجي (التي تم تكوينها لبدء كلمة وانتظر حتى للخروج) & كوت؛ يحل & كوت؛ المشكلة. ومع ذلك، لا أستطيع أن افترض أن وينورد لا يعمل عند بدء تشغيل البرنامج.
لا، ليس هناك الكثير يمكنك القيام به بشكل موثوق به. المشكلة هي، بحلول الوقت الذي استدعاء ويتفوريكسيت التطبيق قد بدأت بالفعل تطبيق آخر وخرجت. ليس هناك طريقة لمعرفة ما إذا كان هذا التطبيق ولدت أي الآخرين في هذه المرحلة.
انها طبيعة process. Start. أنت لا تجد أن ويتفوريكسيت ينتظر إلى أجل غير مسمى لأن العملية قد حان وذهب قبل أن يطلق عليه أنت؟
حسنا، فإنه لا يخلق عملية جديدة، انها مجرد سريع جدا قد لا تظهر في عملية مستكشف. كل عملية. بدءا هو يطلب من العملية لبدء؛ ليس هناك ما هو أكثر من ذلك أن العملية الجديدة مطلوب القيام به. إذا كان لا يريد التمسك في الذاكرة، وهذا هو اختيارها. لا يوجد شيء يمكنك القيام به حيال ذلك، للأسف.
بعض التطبيقات تبدأ دائما عملية جديدة. عند فتح ملف فيسوال ستوديو سلن، على سبيل المثال، فإنه يبدأ دائما عمليتين. هناك تطبيق صغير يتحقق من نوع ملف سلن ثم يفتح إصدار مناسب من فيسوال ستوديو لأنه يمكنك ربط تطبيق واحد فقط لكل ملحق.
المسألة الأخرى هي أن بعض التطبيقات يمكن التعامل مع وثائق متعددة في وقت واحد، مما يعني أنها عموما إعادة استخدام العمليات الموجودة. في مثل هذه الحالات، إذا تم إعادة استخدام العملية لأنه تم فتح مستند بالفعل، فهذا يعني أن المستند الذي قمت بفتحه مع process. Start قد يكون مغلقا، ولكن عملية استضافة لا تزال قيد التشغيل (خدمة المستند الأصلي) مما يعني أنك لا يمكن أبدا معرفة متى تتم إعادة استخدام العملية عند استدعاء process. Start يتم مع المستند الذي تم فتحه مع process. Start الخاص بك.
إذا كنت تبحث لدمج نوع من حل وينورد، أود أن أقترح استخدام الأتمتة. راجع msdn. microsoft/newsgroups/default. aspx؟dg=microsoft. public. officedev&؛lang=en&؛cr=US لإجراء مناقشات حول أتمتة منتجات أوفيس.
جميع الردود.
لا، ليس هناك الكثير يمكنك القيام به بشكل موثوق به. المشكلة هي، بحلول الوقت الذي استدعاء ويتفوريكسيت التطبيق قد بدأت بالفعل تطبيق آخر وخرجت. ليس هناك طريقة لمعرفة ما إذا كان هذا التطبيق ولدت أي الآخرين في هذه المرحلة.
انها طبيعة process. Start. أنت لا تجد أن ويتفوريكسيت ينتظر إلى أجل غير مسمى لأن العملية قد حان وذهب قبل أن يطلق عليه أنت؟
لا، آمل أن لا يحدث هذا الوضع (هل كان ذلك ممكنا؟ لم يفكر فيه من قبل). على أي حال، أن يجيب بوضوح واحدة من المشاكل. شكرا لكم.
ولكن يجب أن يكون هناك سولوتيون إلى المسألة المتعلقة بدء winword. exe (وما شابه ذلك) ذلك. يتم عرض أي عملية إضافية في تاسماناجر (ولكن لا يزال كلمة تظهر). أريد أن أجبر على إنشاء عملية جديدة يمكنني السيطرة عليها.
حسنا، فإنه لا يخلق عملية جديدة، انها مجرد سريع جدا قد لا تظهر في عملية مستكشف. كل عملية. بدءا هو يطلب من العملية لبدء؛ ليس هناك ما هو أكثر من ذلك أن العملية الجديدة مطلوب القيام به. إذا كان لا يريد التمسك في الذاكرة، وهذا هو اختيارها. لا يوجد شيء يمكنك القيام به حيال ذلك، للأسف.
بعض التطبيقات تبدأ دائما عملية جديدة. عند فتح ملف فيسوال ستوديو سلن، على سبيل المثال، فإنه يبدأ دائما عمليتين. هناك تطبيق صغير يتحقق من نوع ملف سلن ثم يفتح إصدار مناسب من فيسوال ستوديو لأنه يمكنك ربط تطبيق واحد فقط لكل ملحق.
المسألة الأخرى هي أن بعض التطبيقات يمكن التعامل مع وثائق متعددة في وقت واحد، مما يعني أنها عموما إعادة استخدام العمليات الموجودة. في مثل هذه الحالات، إذا تم إعادة استخدام العملية لأنه تم فتح مستند بالفعل، فهذا يعني أن المستند الذي قمت بفتحه مع process. Start قد يكون مغلقا، ولكن عملية استضافة لا تزال قيد التشغيل (خدمة المستند الأصلي) مما يعني أنك لا يمكن أبدا معرفة متى تتم إعادة استخدام العملية عند استدعاء process. Start يتم مع المستند الذي تم فتحه مع process. Start الخاص بك.
إذا كنت تبحث لدمج نوع من حل وينورد، أود أن أقترح استخدام الأتمتة. راجع msdn. microsoft/newsgroups/default. aspx؟dg=microsoft. public. officedev&؛lang=en&؛cr=US لإجراء مناقشات حول أتمتة منتجات أوفيس.
كان وينورد مجرد مثال. على الرغم من أن إجابتك لم تكن ما كنت آمل، فإنه يفسر كيف يعمل كل شيء، وما هو السلوك الذي يمكن أن نتوقعه.
حفظ لي الكثير من الوقت تبحث عن شيء غير موجود. شكرا لكم.
تقوم ميكروسوفت بإجراء استطلاع عبر الإنترنت لفهم رأيك لموقع مسن على الويب. إذا اخترت المشاركة، سيتم تقديم الاستبيان عبر الإنترنت لك عند مغادرة موقع مسن على ويب.

مثال الاستخدام.
أنا حلها بهذه الطريقة:
أنا إعادة توجيه كل من المدخلات والمخرجات والخطأ وتناولت القراءة من الإخراج وتدفقات الخطأ. يعمل هذا الحل ل سك 7-8، سواء بالنسبة ويندوز 7 و ويندوز 8.
حاولت جعل فئة من شأنها أن تحل مشكلتك باستخدام تيار غير متزامن قراءة، من خلال اتخاذ في حساب علامة بييرز، روب، ستيفيفاي الأجوبة. القيام بذلك أدركت أن هناك خلل المتعلقة غير متزامن الناتج إخراج تيار قراءة.
لا يمكنك القيام بذلك:
سوف تتلقى System. InvalidOperationException: لم تتم إعادة توجيه ستانداردوت أو لم تبدأ العملية حتى الآن.
ثم لديك لبدء إخراج غير متزامن قراءة بعد بدء العملية:
القيام بذلك، جعل حالة سباق لأن تيار الإخراج يمكن أن تتلقى البيانات قبل تعيينه إلى غير متزامن:
ثم بعض الناس يمكن أن أقول أن لديك فقط لقراءة تيار قبل تعيينه إلى غير متزامن. ولكن نفس المشكلة تحدث. سيكون هناك حالة سباق بين قراءة متزامن وتعيين تيار في وضع غير متزامن.
لا توجد طريقة للحصول على قراءة غير متزامنة آمنة من تيار الإخراج من عملية في الطريقة الفعلية "عملية" و "بروسيسستارتينفو" تم تصميم.
ربما كنت أفضل باستخدام قراءة غير متزامن مثل اقترح من قبل المستخدمين الآخرين لحالتك. ولكن يجب أن تكون على علم بأنك يمكن أن تفوت بعض المعلومات بسبب حالة السباق.
أي من الإجابات أعلاه هو القيام بهذه المهمة.
الحل روب معلقة وحل "مارك بييرز 'الحصول على استثناء التخلص منها. (حاولت" حلول "من الإجابات الأخرى).
لذلك قررت أن أقترح حل آخر:
هذا رمز تصحيحها ويعمل تماما.
أنا شيء أن هذا هو نهج بسيط وأفضل (نحن لسنا بحاجة أوتوريزيتيفنت):
كنت تواجه نفس المشكلة، ولكن السبب كان مختلفا. ومع ذلك فإنه يحدث تحت ويندوز 8، ولكن ليس تحت ويندوز 7. يبدو أن السطر التالي قد تسبب في المشكلة.
كان الحل عدم تعطيل وسشليكسكيوت. تلقيت الآن نافذة منبثقة شل، غير المرغوب فيها، ولكن أفضل بكثير من البرنامج في انتظار لا شيء معين أن يحدث. لذلك أضفت العمل التالي حول ذلك:
الآن الشيء الوحيد الذي يزعجني هو لماذا يحدث هذا تحت ويندوز 8 في المقام الأول.
المقدمة.
الإجابة المقبولة حاليا لا تعمل (يلقي استثناء) وهناك الكثير من الحلول ولكن لا يوجد رمز كامل. ومن الواضح أن هذا يضيع الكثير من الوقت الناس لأن هذا هو السؤال الشعبي.
الجمع بين إجابة مارك بييرز وإجابة كارول تيل كتبت الكود الكامل على أساس كيف أريد استخدام الأسلوب Process. Start.
لقد استخدمته لإنشاء الحوار التقدم حول أوامر جيت. هذه هي الطريقة التي استخدمتها:
من الناحية النظرية يمكنك أيضا الجمع بين ستدوت وستدير، ولكن لم اختبر ذلك.
وأنا أعلم أن هذا العشاء القديم ولكن بعد قراءة هذه الصفحة بأكملها لا شيء من الحلول كان يعمل بالنسبة لي، على الرغم من أنني لم أحاول محمد ريحان كما كان من الصعب قليلا على رمز لمتابعة، على الرغم من أنني أعتقد أنه كان على الطريق الصحيح . عندما أقول أنها لم تعمل هذا ليس صحيحا تماما، وأحيانا أنها سوف تعمل بشكل جيد، وأعتقد أنه هو شيء للقيام به مع طول الإخراج قبل علامة إوف.
على أي حال، كان الحل الذي عملت بالنسبة لي لاستخدام المواضيع المختلفة لقراءة ستانداردوتبوت و ستانداردرور وكتابة الرسائل.
نأمل أن يساعد هذا الشخص، الذي يعتقد أن هذا يمكن أن يكون من الصعب جدا!
الحلول الأخرى (بما في ذلك EM0 في) لا يزال مسدودا لتطبيقي، بسبب مهلات الداخلية واستخدام كل من ستانداردوتبوت و ستانداردرور من تطبيق ولدت. هنا هو ما عمل لي:
تحرير: إضافة التهيئة من ستارتينفو إلى نموذج التعليمات البرمجية.
هذه الوظيفة ربما عفا عليها الزمن ولكن اكتشفت السبب الرئيسي لماذا عادة تعليق هو بسبب تجاوز كومة ل ريديريكتستانداردوتبوت أو إذا كان لديك ريديريكتستانداردورور.
كما بيانات الإخراج أو بيانات الخطأ كبيرة، وسوف يسبب وقت تعليق لأنه لا يزال يعالج لمدة غير محددة.

No comments:

Post a Comment