アプリケーションが System.Diagnostics クラスを使用してシステム上でコマンドを実行する Web アプリを作成しています。完了までに時間がかかるコマンドからのリアルタイム出力を表示したかったのです。少し調べたところ、BeginOutputReadLine は出力をイベント ハンドラーにストリーミングできることがわかりました。
また、jquery ajax を使用してこのメソッドを呼び出し、プロセスを非同期で実行しています。これまでのところ、私はこのようにしようとしています:
Process p2= new Process();
p2.OutputDataReceived += new DataReceivedEventHandler(opHandler);
p2= Process.Start (psi2);
p2.BeginOutputReadLine();
コマンドの出力を静的メソッドからアクセスできないラベルとしてページに格納する静的変数を持つクラスを宣言しました。
public class ProcessOutput
{
public static string strOutput;
[WebMethod]
public static string getOutput()
{
return strOutput;
}
}
BeginOutputReadLine のイベント ハンドラーで、変数に出力からの行を設定します。
private static void opHandler(object sendingProcess,DataReceivedEventArgs outLine)
{
if (!String.IsNullOrEmpty(outLine.Data))
{
ProcessOutput.strOutput= outLine.Data;
}
}
そしてaspxページから、メソッドを呼び出してstrOutputの値を取得しています
$(document).ready(function() {
setInterval(function() {
$.ajax({
type: "GET",
url: "newscan.aspx/getOutput",
data: "",
success: function(msg){
$('#txtAsyncOp').append(msg.d);
}
});
}, 1000);
});
理由はわかりませんが、ラベルが更新されていません。アラートを設定すると、10 秒ごとにアラート ボックスに「未定義」と表示されます。誰かがそれを正しく行う方法を教えてもらえますか?