我正在编写一个 Web 应用程序,其中应用程序使用 System.Diagnostics 类在系统上运行命令。我想显示命令的实时输出,这需要很长时间才能完成。经过一番搜索,我发现 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 秒就会在警报框中得到“未定义”。任何人都可以建议我如何正确地做到这一点?