显示在MVC中运行的命令行进程的进度

时间:2013-08-20 06:17:17

标签: asp.net-mvc command-line system.diagnostics

我编写了一个MVC操作,它运行带有输入参数的实用程序,并将实用程序输出写入响应html。这是完整的方法:

        var jobID = Guid.NewGuid();

        // save the file to disk so the CMD line util can access it
        var inputfilePath = Path.Combine(@"c:\", String.Format("input_{0:n}.json", jobID));
        var outputfilePath = Path.Combine(@"c:\", String.Format("output{0:n}.json", jobID));
        using (var inputFile = System.IO.File.CreateText(inputfilePath))
        {
            inputFile.Write(i_JsonInput);
        }


        var psi = new ProcessStartInfo(@"C:\Code\FoxConcept\FoxConcept\test.cmd", String.Format("{0} {1}", inputfilePath, outputfilePath))
        {
            WorkingDirectory = Environment.CurrentDirectory,
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            CreateNoWindow = true
        };

        using (var process = new Process { StartInfo = psi })
        {
            // delegate for writing the process output to the response output
            Action<Object, DataReceivedEventArgs> dataReceived = ((sender, e) =>
            {
                if (e.Data != null) // sometimes a random event is received with null data, not sure why - I prefer to leave it out
                {
                    Response.Write(e.Data);
                    Response.Write(Environment.NewLine);
                    Response.Flush();
                }
            });

            process.OutputDataReceived += new DataReceivedEventHandler(dataReceived);
            process.ErrorDataReceived += new DataReceivedEventHandler(dataReceived);

            // use text/plain so line breaks and any other whitespace formatting is preserved
            Response.ContentType = "text/plain";

            // start the process and start reading the standard and error outputs
            process.Start();
            process.BeginErrorReadLine();
            process.BeginOutputReadLine();

            // wait for the process to exit
            process.WaitForExit();

            // an exit code other than 0 generally means an error
            if (process.ExitCode != 0)
            {
                Response.StatusCode = 500;
            }
        }
        Response.End();

该实用程序需要大约一分钟才能完成,并且在此过程中会显示相关信息。 是否可以在用户浏览器上显示信息?

1 个答案:

答案 0 :(得分:0)

我希望此链接有所帮助:Asynchronous processing in ASP.Net MVC with Ajax progress bar
您可以调用Controller的操作方法并获取该过程的状态。

enter image description here

控制器代码:

    /// <summary>
    /// Starts the long running process.
    /// </summary>
    /// <param name="id">The id.</param>
    public void StartLongRunningProcess(string id)
    {
        longRunningClass.Add(id);            
        ProcessTask processTask = new ProcessTask(longRunningClass.ProcessLongRunningAction);
        processTask.BeginInvoke(id, new AsyncCallback(EndLongRunningProcess), processTask);
    }

jQuery代码:

    $(document).ready(function(event) {
        $('#startProcess').click(function() {
            $.post("Home/StartLongRunningProcess", { id: uniqueId }, function() {
                $('#statusBorder').show();
                getStatus();
            });
            event.preventDefault;
        });
    });

    function getStatus() {
        var url = 'Home/GetCurrentProgress/' + uniqueId;
        $.get(url, function(data) {
            if (data != "100") {
                $('#status').html(data);
                $('#statusFill').width(data);
                window.setTimeout("getStatus()", 100);
            }
            else {
                $('#status').html("Done");
                $('#statusBorder').hide();
                alert("The Long process has finished");
            };
        });
    }