在服务器上运行exe之前更新页面

时间:2017-09-20 19:59:55

标签: c# asp.net

这是我想要做的。它是一个C#ASP页面。

  • 用户选择日期
  • 用户点击"导入"
  • 存储在/ AppData /中的Exe
  • 状态讯息" Running"显示在页面< - 此处发布
  • 当exe关闭时,状态消息显示"完成"

以下是导入按钮的代码:

Process[] pDTExport = Process.GetProcessesByName("DTImport");

if (pDTExport.Length != 0)
{
    prgStatus.Visible = false;
    txtStatus.Text = "Unable to import data: another import process is already running. Please wait for it to finish before trying again.";
    txtStatus.ForeColor = Color.Red;
}
else
{
    txtStatus.Text = "The import process is running..."; <-- Issue here
    LaunchExe();
}

我是如何启动exe的:

    private void LaunchExe()
    {
        string exePath = Server.MapPath("~/App_Data/DTImport.exe");

        if (File.Exists(exePath))
        {
            Process pImport = new Process();

            pImport.StartInfo.FileName = exePath;
            pImport.StartInfo.Arguments = "-d " + txtDate.Text;
            pImport.Start();

            pImport.WaitForExit();

            txtStatus.Text = "Done!";
            txtStatus.ForeColor = Color.Green;
            prgStatus.Visible = false;
        }
        else
        {
            txtStatus.Text = "DTImport.exe was not found in /AppData/"
            txtStatus.ForeColor = Color.Red;
            prgStatus.Visible = false;
        }
    }

我遇到的问题是在启动exe之前更新前端。我希望它能做到这一点:点击按钮 - &gt;显示正在运行的消息 - &gt;启动exe。

目前,当我点击按钮时,exe会运行,但我从未看到&#34;导入过程正在运行&#34;消息,只是&#34;完成!&#34;完成之后。

我知道这是因为

pImport.WaitForExit();

正在阻止主线程。我尝试在ViewState事件中存储/读取Page_Load变量,尝试通过按钮启动回发导致的exe,但它没有工作。如何在exe运行之前如何更新UI?

1 个答案:

答案 0 :(得分:1)

您可以将事件处理程序注册到pImport.Exit事件。这允许您避免waitForExit。在已注册的方法中,您可以管理导入完成的更新。