C#检测相同的可执行文件是否正在运行并等待直到其关闭

时间:2015-10-01 23:52:02

标签: c#

我有一个针对新闻的Web应用程序以及一些指南。

在后端,你有一个功能,你可以上传多个图像,没有限制,分页的原因。

在将图像成功添加到JPEG和PNG的ImageOptimizer任务条目后,Controller运行。

我今天做了一个很大的压力测试,我的记忆力是100%,因为这些过程都在同一时间运行。

我的问题是: 是否可以让ProcessStart等到相同的可执行文件结束?这会有很大的帮助: - )

启动任务的代码粘贴在下面。所以我在C#中使用简单的ProccessStart Cls。

    public static string Do(string path, bool clientMode = false)
    {
        /** I want to do something like this:**/
        while(ThisExecutableIsAllreadyRunning);

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.AppendFormat("Optimizing \"{0}\"", path).AppendLine();
        long length = new FileInfo(path).Length;
        stringBuilder.AppendFormat("Size before: {0}", length).AppendLine();
        string text = "~/Executables/optipng.exe";
        if (clientMode)
        {
            if (String.IsNullOrEmpty(ClientModeExecutablePath))
                throw new Exception("Client Mode for IMG Optim required ClientModeExecutablePath to be set");

            text = ClientModeExecutablePath;
        }
        else
            text = HttpContext.Current.Server.MapPath(text);
        Process process = Process.Start(text, "-strip all " + path);
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.CreateNoWindow = false;
        process.Start();
        while (!process.StandardOutput.EndOfStream)
        {
            string value = process.StandardOutput.ReadLine();
            stringBuilder.AppendLine(value);
        }
        length = new FileInfo(path).Length;
        stringBuilder.AppendFormat("Size After: {0}", length).AppendLine();
        stringBuilder.AppendLine("Done...");
        return stringBuilder.ToString();
    }

2 个答案:

答案 0 :(得分:0)

  

是否可以让ProcessStart等待直到相同的可执行文件结束?

当然可以。如果我已正确理解您,您希望等待该过程退出,直到继续。试试这段代码:

Process process = Process.Start(text, "-strip all " + path);
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = false;
process.Start();
while (!process.StandardOutput.EndOfStream)
{
     string value = process.StandardOutput.ReadLine();
     stringBuilder.AppendLine(value);
}
process.WaitForExit();  // <-------- WAIT HERE

MSDN:

  

指示Process组件无限期地等待关联进程退出。 WaitForExit()使当前线程等待,直到关联的进程终止。应该在进程上调用所有其他方法之后调用它。要避免阻止当前线程,请使用已退出事件。

并发

很难判断您的Do()方法是否同时被调用。如果是这样,您可能希望使用某种形式的lock()或关键部分来保护它,以确保一次只生成一个进程。 这使得警卫成为煽动者

或者,您可以在.EXE中创建一个命名的互斥锁。如果发现以前退出的互斥锁应立即退出。 这会使警卫处于行动中。

祝你好运!

Tell me more

答案 1 :(得分:0)

以下是如何检查特定的 exe 应用程序是否已由于某个其他线程或进程而正在运行:

using System.Diagnostics;

//get all currently running applications
var allProcesses = Process.GetProcesses().ToList();
//filter out the processes that don't match the exe you're trying to launch
foreach(var process in allProcesses.Where(p => p.Modules[0].FileName.ToLower().EndsWith(ClientModeExecutablePath.ToLower())))
{
    try
    {           
        Console.WriteLine("Process: {0} ID: {1}, file:{2}", process.ProcessName, process.Id, process.Modules[0].FileName);
        //wait for the running process to complete
        process.WaitForExit();
    }
    catch (Exception ex)
    {
        Console.WriteLine (ex);
    }

   //now launch your process
   //two threads could still launch the process at the same time after checking for any running processes

}