即使在显式关闭Process之后,程序也会通过cmd在后台运行

时间:2013-11-26 15:04:59

标签: c# .net batch-file asynchronous process

我有一个Process l_batchProcess,并在内部执行cmd.exe,其中包含与CAT.NET cmd相关的某些命令,但当我显式关闭Process实例时,我看到了它仍然在后台执行CAT.NET cmd.exe。

还有另一个问题;我不确定l_batchProcess.WaitForExit()是否有任何事情要做,一旦CAT.NET在后台完成,就要让程序恢复。当我检查l_batchProcess时,似乎该进程已退出,并且未告知任何进程已关联。

有人可以指导我,如果需要更多详细信息,请告诉我。 ExecuteBatchFile以异步方式运行。

public string ExecuteBatchFile(BatchFile batchFile)
{
    //var lockObject = new object();
    string returnMessage = string.Empty;
    l_batchProcess.StartInfo = new ProcessStartInfo()
    {
        FileName = batchFile.InputFilePath,
        UseShellExecute = false,
        CreateNoWindow = true,
        RedirectStandardError = true,
        RedirectStandardOutput = true,
    };

    if (File.Exists(batchFile.InputFilePath))
    {
        try
        {
            l_batchProcess.Refresh();
            l_batchProcess.Start();
            processStartedFlag = true;
            l_batchProcess.BeginOutputReadLine();
            l_batchProcess.BeginErrorReadLine();
            l_batchProcess.WaitForExit();

            if (l_batchProcess.ExitCode != 0)
                returnMessage = "Errors while executing";
        }
        finally
        {
            CloseProcess();
        }
    }
    else
    {
        returnMessage = "Batch File path incorrect";
    }
    File.Delete(batchFile.InputFilePath);
    return returnMessage;
}

public bool CloseProcess()
{
    if (!processStartedFlag) return false;
    l_batchProcess.CancelOutputRead();
    l_batchProcess.CancelErrorRead();
    l_batchProcess.Close();
    processStartedFlag = false;
    return true;
}

编辑:很抱歉,我认为从我的问题来看,该过程似乎仍在正常过程中运行,我的意思是当我明确尝试关闭该过程时。

1 个答案:

答案 0 :(得分:0)

似乎有效的一种解决方法是直接调用CAT.NET的可执行文件并传递arguments。然后我Kill进程代替Close。这样我就可以控制杀死可执行文件。 但似乎并不优雅。 PowerShell看起来确实是一个有趣的解决方案。