Monday 26 February 2018

عملية ويتفوريكسيت ج # تعليق


سجل والتر.
. الكتابة أثناء التعلم.
الجمعة 18 تشرين الثاني / نوفمبر 2018.
process. WaitForExit (Int32) معلقة المشكلة.
كما ترون، التعليمات البرمجية يبدأ عملية "cmd. exe" ويمر إليها الأمر أريد أن يتم تنفيذها.
في التعليمات البرمجية استخدم الأمر بينغ - t 8.8.8.8 الذي، بسبب الخيار - t، بينغ المضيف دون توقف. ما يحدث؟ عملية "cmd. exe" جنبا إلى جنب مع الأمر بينغ - t أبدا يخرج ولا يغلق تيار ستدوت وهكذا تعليق التعليمات البرمجية لدينا في أوتبوت = process. StandardOutput. ReadToEnd ()؛ خط لأنه لا يمكن أن تنجح قراءة كل تيار.
يحدث نفس الشيء أيضا إذا كان الأمر في ملف دفعي يعلق لأي سبب من الأسباب، وبالتالي فإن التعليمات البرمجية أعلاه يمكن أن تعمل بشكل مستمر لسنوات ثم تعليق فجأة دون أي سبب واضح.
يمكنك تجربة حالة توقف تام إذا كان الأمر الذي تعلقه على "cmd. exe" أو العملية التي تتصل بها يملأ الإخراج القياسي أو الخطأ القياسي. هذا لأن التعليمات البرمجية لدينا لا يمكن الوصول إلى خطوط.
في واقع الأمر عملية الطفل (الأمر بينغ أو ملف دفعي أو أي عملية كنت تنفذ) لا يمكن أن تستمر إذا برنامجنا لا يقرأ المخازن المؤقتة شغل من تيارات وهذا لا يمكن أن يحدث لأن التعليمات البرمجية هو معلق على الخط مع العملية. ويتفوريكسيت () والتي سوف تنتظر إلى الأبد لمشروع الطفل للخروج.
الحجم الافتراضي لكل من تيارات هو 4096 بايت. يمكنك اختبار هذه الأحجام اثنين مع هذه الملفات دفعة:

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

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

process. waitforexit c # معلقة
لقد نظرت في مواضيع مختلفة حول هذا، ولكن كل منهم يستخدم process. RedirectStandardOutput = صحيح، وأنا لا.
أنا أحاول فتح عملية (تطبيق وحدة التحكم، وليس التي أدلى بها لي) لجعله تجميع ملف. acs خاص إلى ملف. o. بنية بسيطة، والحجة الوحيدة هي الملف الذي تريد تجميع.
ولكن على بعض الملفات يعلق طلبي عند محاولة فتح العملية. وإليك شفرتي:
لبدء العملية أنا استخدم إلى حد كبير نفس الرمز الذي الرجل الآخر المحرز في C #. وتعمل التعليمات البرمجية له تماما.
آمل أن يكون يومك أفضل من أمس، ولكن هذا أسوأ من الغد.
يرجى وضع علامة كجواب إذا حلت مشكلتك. :)
حرره فيسوال فينسينت السبت، يناير 03، 2018 2:57 م.
هل قارنت أسماء الملفات والحجج تلك التي تعمل وتلك التي لا؟ هل هناك أي فرق فيها مثل تلك التي لا تحتوي على مساحات فارغة في اسم الملف أو الوسيطات وتلك التي تعمل لا تحتوي على مسافات فارغة فيها؟ إذا وجدت أن تكون المشكلة ثم تحتاج إلى إضافة اقتباسات إلى بداية ونهاية فلنام أو وسيطات.
تخميني الأول هو الحجج يحتاج إلى اقتباسات مثل هذا لأنني أرى المساحات الفارغة في المثال الخاص بك من الحجج.
إذا كنت تقول أنه لا يمكن القيام به ثم سأحاول ذلك.
حرره إيرونرازيرز السبت، يناير 03، 2018 3:51 م تم وضع علامة كجواب من قبل فيسوال فنسنت السبت، يناير 03، 2018 4:33 بيإم.
جميع الردود.
هل قارنت أسماء الملفات والحجج تلك التي تعمل وتلك التي لا؟ هل هناك أي فرق فيها مثل تلك التي لا تحتوي على مساحات فارغة في اسم الملف أو الوسيطات وتلك التي تعمل لا تحتوي على مسافات فارغة فيها؟ إذا وجدت أن تكون المشكلة ثم تحتاج إلى إضافة اقتباسات إلى بداية ونهاية فلنام أو وسيطات.
تخميني الأول هو الحجج يحتاج إلى اقتباسات مثل هذا لأنني أرى المساحات الفارغة في المثال الخاص بك من الحجج.
إذا كنت تقول أنه لا يمكن القيام به ثم سأحاول ذلك.
حرره إيرونرازيرز السبت، يناير 03، 2018 3:51 م تم وضع علامة كجواب من قبل فيسوال فنسنت السبت، يناير 03، 2018 4:33 بيإم.
هل حاولت نفس الأمر يدويا في إطار وحدة التحكم؟ ربما يتوقف وينتظر شيئا. أو عدم تعيين كريتنويندو، إرورديالوغ و ويندوستيل ونرى ما سيحدث.
حرره Viorel_ مفب السبت، يناير 03، 2018 4:27 بيإم.
هل قارنت أسماء الملفات والحجج تلك التي تعمل وتلك التي لا؟ هل هناك أي فرق فيها مثل تلك التي لا تحتوي على مساحات فارغة في اسم الملف أو الوسيطات وتلك التي تعمل لا تحتوي على مسافات فارغة فيها؟ إذا وجدت أن تكون المشكلة ثم تحتاج إلى إضافة اقتباسات إلى بداية ونهاية فلنام أو وسيطات.
تخميني الأول هو الحجج يحتاج إلى اقتباسات مثل هذا لأنني أرى المساحات الفارغة في المثال الخاص بك من الحجج.
إذا كنت تقول أنه لا يمكن القيام به ثم سأحاول ذلك.
هذا في الواقع جعله. كنت قد نسيت أن المساحات الفارغة يجعلها حجة جديدة، سخيفة لي. أنا لا تستخدم وسيطات العملية التي غالبا ما. ؛)
آمل أن يكون يومك أفضل من أمس، ولكن هذا أسوأ من الغد.
يرجى وضع علامة كجواب إذا حلت مشكلتك. :)
حرره فيسوال فنسنت السبت، 3 يناير، 2018 4:33 م.
هل حاولت نفس الأمر يدويا في إطار وحدة التحكم؟ ربما يتوقف وينتظر شيئا. أو عدم تعيين كريتنويندو، إرورديالوغ و ويندوستيل ونرى ما سيحدث.
القيام بذلك بالطريقة العادية (السحب والإفلات، أو القيام بذلك عبر سمد) يعمل، نعم.
آمل أن يكون يومك أفضل من أمس، ولكن هذا أسوأ من الغد.
يرجى وضع علامة كجواب إذا حلت مشكلتك. :)
إذا كنت تقول أنه لا يمكن القيام به ثم سأحاول ذلك.
حرره إيرونرازيرز السبت، 03 يناير، 2018 4:39 م.
تقوم ميكروسوفت بإجراء استطلاع عبر الإنترنت لفهم رأيك لموقع مسن على الويب. إذا اخترت المشاركة، سيتم تقديم الاستبيان عبر الإنترنت لك عند مغادرة موقع مسن على ويب.

process. waitforexit c # معلقة
لدي التعليمات البرمجية التالية في طلبي:
System. Diagnostics. Process بروك = نيو System. Diagnostics. Process ()؛
بمجرد استدعاء هذا من خلال تطبيق آخر عملية معلقة.
ثم أعطيت مهلة من 5 ثوان والآن يعمل بشكل جيد. ولكن أنا بحاجة إلى إيجاد طريقة أفضل لتحديد هذه المشكلة حيث أن هذه القيمة مهلة يمكن أن تعتمد على موارد النظام وكمية من مدخلات التطبيق لديه لمعالجة.
لذا، سؤالي هو إذا كنا نقوم بإنشاء عملية باستخدام System. Diagnostics، لا أوس إنشاء مؤشر ترابط منفصل وجعله الموضوع الأساسي أو مؤشر ترابط واجهة المستخدم؟
أو هو إنشاء موضوع كلر الذي هو نفسه System. Threading. Thread؟
إذا استخدمنا موضوع تجمع لإنشاء مؤشر ترابط عامل، أن يكون هذا الخيار أفضل؟
هل يستخدم تجمع الترابط جدولة وضع المستخدم؟
نقدر مساعدتكم في هذا الشأن.
أنا بحاجة إلى معرفته عن ذلك لأنه إذا System. Diagnostics يخلق أيضا موضوع الخلفية أو عامل الموضوع، أي نقطة إنشاء موضوع منفصل مرة أخرى كما لن يكون هناك أي تغيير في نهاية اليوم.
ما هو الفرق بين التنفيذ أعلاه على إنشاء مؤشر ترابط الخلفية؟
كنت مربكا المواضيع الداخلية والخارجية إلى التطبيق الخاص بك. إذا كنت تستخدم ويتفوريكسيت على مؤشر ترابط واجهة المستخدم. فإنه سيتم حظر مؤشر ترابط واجهة المستخدم مما يجعلها غير مستجيبة. إذا كان هذا مشكلة، تفرخ العملية الجديدة في الحدث دوورك من باكغروندوركر. عند خروج العملية، سيتم تشغيل رونوركركومبليتيفنت، وتنبيه مؤشر ترابط واجهة المستخدم الخاص بك.
وضع علامة كجواب من قبل مين تشو فريق وحدات مايكروسوفت، مشرف الاثنين، 18 يوليو 2018 3:10 ص.
جميع الردود.
في انتظار حدث مع إنابليرايسينجيفنتس = كاذبة يعني أنك تستخدم ويتفوريكسيت كموقت. تعيينه إلى قيمة مناسبة.
في انتظار حدث مع إنابليرايسينجيفنتس = كاذبة يعني أنك تستخدم ويتفوريكسيت كموقت. تعيينه إلى قيمة مناسبة.
لقد أعطيت 5000 كقيمة وثابت المشكلة. قلبي هو أنها سوف تعمل مماثلة تحت مختلف موارد النظام، حجم المحتوى المدخلات الخ؟
ماذا سيحدث إذا لم يتم إنهاء العملية المرتبطة بنهاية الفاصل الزمني؟
ويندوز ليس نظام التشغيل في الوقت الحقيقي، لذلك أي توقيت سوف تعتمد على جدولة نظام التشغيل. من المفترض، و System. Timers. Timer هو الأكثر دقة.
& كوت؛ ماذا سيحدث إذا لم يتم إنهاء العملية المقترنة بحلول نهاية الفاصل الزمني؟ & كوت؛ لقد عطلت هذه الميزة. إذا كان هذا هو ما تحاول القيام به، تمكينه. إذا كنت لا تريد حظر مؤشر الترابط الذي استخدمته لبدء العملية، ابدأ تشغيله من مؤشر ترابط الخلفية. و باكغسروندوركر يكون مناسبا لهذا.
أنا بحاجة إلى معرفته عن ذلك لأنه إذا System. Diagnostics يخلق أيضا موضوع الخلفية أو عامل الموضوع، أي نقطة إنشاء موضوع منفصل مرة أخرى كما لن يكون هناك أي تغيير في نهاية اليوم.
ما هو الفرق بين التنفيذ أعلاه على إنشاء مؤشر ترابط الخلفية؟
أنا بحاجة إلى معرفته عن ذلك لأنه إذا System. Diagnostics يخلق أيضا موضوع الخلفية أو عامل الموضوع، أي نقطة إنشاء موضوع منفصل مرة أخرى كما لن يكون هناك أي تغيير في نهاية اليوم.
ما هو الفرق بين التنفيذ أعلاه على إنشاء مؤشر ترابط الخلفية؟
كنت مربكا المواضيع الداخلية والخارجية إلى التطبيق الخاص بك. إذا كنت تستخدم ويتفوريكسيت على مؤشر ترابط واجهة المستخدم. فإنه سيتم حظر مؤشر ترابط واجهة المستخدم مما يجعلها غير مستجيبة. إذا كان هذا مشكلة، تفرخ العملية الجديدة في الحدث دوورك من باكغروندوركر. عند خروج العملية، سيتم تشغيل رونوركركومبليتيفنت، وتنبيه مؤشر ترابط واجهة المستخدم الخاص بك.
وضع علامة كجواب من قبل مين تشو فريق وحدات مايكروسوفت، مشرف الاثنين، 18 يوليو 2018 3:10 ص.
تقوم ميكروسوفت بإجراء استطلاع عبر الإنترنت لفهم رأيك لموقع مسن على الويب. إذا اخترت المشاركة، سيتم تقديم الاستبيان عبر الإنترنت لك عند مغادرة موقع مسن على ويب.

No comments:

Post a Comment