我有一个针对新闻的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();
}
答案 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中创建一个命名的互斥锁。如果发现以前退出的互斥锁应立即退出。 这会使警卫处于行动中。
祝你好运!答案 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
}