gpt4 book ai didi

asp.net - 在asp.net中实时显示命令行程序的输出

转载 作者:行者123 更新时间:2023-12-01 05:58:48 25 4
gpt4 key购买 nike

我正在编写一个 Web 应用程序,其中应用程序使用 System.Diagnostics 类在系统上运行命令。我想显示需要花费大量时间才能完成的命令的实时输出。经过一番搜索后,我发现 BeginOutputReadLine 可以将输出流式传输到事件处理程序。

我还使用 jquery ajax 来调用此方法并使进程异步运行。到目前为止,我正在尝试这样做:

Process p2= new Process();
p2.OutputDataReceived += new DataReceivedEventHandler(opHandler);
p2= Process.Start (psi2);<br/>
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 秒就会在警报框中显示“未定义”。有人可以建议我如何正确地做到这一点吗?

最佳答案

每个请求都会启动一个新线程作为请求管道的一部分。这是设计使然。每个线程都有自己的堆栈,并且不能访问彼此的堆栈。当线程开始运行新方法时,它将该方法中的参数和局部变量存储在自己的堆栈上。长话短说,您将无法分配该变量并期望从另一个请求中检索其值。

您可以采取几种方法,您可以将其范围限定为 session 变量(最常见):

System.Web.HttpContext.Current.Session["variable"]  = value ; 

或者您可以使用以下方法将其设置为应用程序范围:

if (System.Web.Caching.Cache["Key1"] == null)
System.Web.Caching.Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove);

或者,您可以将输出记录到数据库或文件中,并通过 WebMethod 回显结果。如果您的长时间运行的进程是异步运行的,您将无法访问 HttpContext——因此 Session 状态包将不可用;可以使用应用程序缓存,但它通常不用于这种类型的机制(缓存是出于性能原因而可用,而不是持久性机制 - 重要的是要记住,您无法控制 Web 应用程序何时回收)。

我强烈建议写入数据库或日志文件。异步流程通常需要记录输出或跟踪来诊断潜在问题并验证结果。

此外,由于您无法控制 Web 应用程序何时回收,因此您很容易失去对正在启动的子进程的控制。更好的设计将开始 asynchronous method in-process ,或轮询数据库以获取作业的进程外应用程序或服务(可能使用任务计划程序或 cron,具体取决于您的平台)。

关于asp.net - 在asp.net中实时显示命令行程序的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13082195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com