3

このコードは「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. 必要に応じて外部アプリケーションを強制終了し、これがいつ発生したかを検出します (ユーザーが「キャンセル」を押した場合に適切な手順を実行できるようにします)

推奨されるコード スニペットはありますか?

4

1 に答える 1

1

StandardOutput プロパティは、ReadToEnd 以外のメソッドを持つ StreamReader 型です。コードは増えますが、Read メソッドを使用した場合は、ユーザーに何らかの進行状況をキャンセルまたは報告する機会を提供するなど、他のことを行うことができます。

コード サンプルを含む Read メソッドへのリンク:

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

編集:

Process クラスには、コールバックを伴う非同期メソッド呼び出しである BeginOutputReadLine メソッドもあります。

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

于 2010-04-12T15:14:46.937 に答える