إعادة التوجيه والحالة في الوقت الفعلي stdout لعملية طويلة المدى في vb.net

StackOverflow https://stackoverflow.com/questions/2623028

سؤال

ينفذ هذا الرمز "Handbrakecli" (تطبيق سطر الأوامر) ويضع الإخراج في سلسلة:

Dim p As Process = New Process    
p.StartInfo.FileName = "handbrakecli"
p.StartInfo.Arguments = "-i [source] -o [destination]"
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.Start

Dim output As String = p.StandardOutput.ReadToEnd
p.WaitForExit 

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

لذلك أحاول العثور على عينة توضح أفضل طريقة ل:

  1. بدء تطبيق خارجي (مخفي)
  2. راقب ناتجه بشكل دوري لأنه يعرض معلومات حول تقدمه (حتى أتمكن من استخراج هذا وتقديم شريط مئوي لطيف للمستخدم)
  3. حدد متى ينتهي التطبيق الخارجي (لذلك لا يمكنني متابعة تنفيذ التطبيقات الخاصة بي)
  4. اقتل التطبيق الخارجي إذا لزم الأمر واكتشف متى حدث ذلك (بحيث إذا قام المستخدم "بإلغاء" ، فأنا أتخذ الخطوات المناسبة)

هل لدى أي شخص أي قصاصات رمز موصى بها؟

هل كانت مفيدة؟

المحلول

خاصية StandardOutput هي من نوع StreamReader ، الذي يحتوي على طرق أخرى غير ReadToend. سيكون المزيد من التعليمات البرمجية ، ولكن إذا استخدمت طريقة القراءة ، فيمكنك القيام بأشياء أخرى مثل تزويد المستخدم بفرصة إلغاء أو الإبلاغ عن نوع من التقدم.

رابط لقراءة الطريقة مع نموذج الكود:

http://msdn.microsoft.com/en-us/library/ath1fht8(v=vs.90).aspx

يحرر:

تحتوي فئة العملية أيضًا على طريقة QuietOutputReadLine وهي استدعاء طريقة غير متزامن مع رد الاتصال.

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputReadline(v=Vs.90).aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top