إعادة التوجيه والحالة في الوقت الفعلي stdout لعملية طويلة المدى في vb.net
-
26-09-2019 - |
سؤال
ينفذ هذا الرمز "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 دقيقة لإكماله الذي لن يتم الإبلاغ عن أي شيء إلى المستخدم. بمجرد اكتماله ، سيشاهدون جميع الإخراج من التطبيق الذي يتضمن تفاصيل التقدم. ليست مفيدة جدا.
لذلك أحاول العثور على عينة توضح أفضل طريقة ل:
- بدء تطبيق خارجي (مخفي)
- راقب ناتجه بشكل دوري لأنه يعرض معلومات حول تقدمه (حتى أتمكن من استخراج هذا وتقديم شريط مئوي لطيف للمستخدم)
- حدد متى ينتهي التطبيق الخارجي (لذلك لا يمكنني متابعة تنفيذ التطبيقات الخاصة بي)
- اقتل التطبيق الخارجي إذا لزم الأمر واكتشف متى حدث ذلك (بحيث إذا قام المستخدم "بإلغاء" ، فأنا أتخذ الخطوات المناسبة)
هل لدى أي شخص أي قصاصات رمز موصى بها؟
المحلول
خاصية 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