当我获取到一个 System.Diagnostics.Process
的引用时,如何知道进程当前是否正在运行?
尽管 .Net 框架支持通过进程 ID 检查现有进程的 API,但这些函数非常慢。运行 Process.GetProcesses() 或 Process.GetProcessById/Name() 需要大量的 CPU 循环。
检查正在运行的进程 ID 的更快方法是使用本地 API OpenProcess()。如果返回的句柄为 0,则该进程不存在。如果句柄不为 0,则该进程正在运行。由于权限问题,无法保证此方法始终能够 100% 正常工作。
我尝试了Coincoin的解决方案:
在处理某个文件之前,我将其复制为临时文件并打开它。
完成后,如果应用程序仍然处于打开状态,我会关闭它并删除临时文件:
我只是使用一个进程变量,然后进行检查:
private Process openApplication;
private void btnOpenFile_Click(object sender, EventArgs e) {
...
// copy current file to fileCache
...
// open fileCache with proper application
openApplication = System.Diagnostics.Process.Start( fileCache );
}
...
openApplication.Refresh();
// close application if it is still open
if ( !openApplication.HasExited() ) {
openApplication.Kill();
}
// delete temporary file
System.IO.File.Delete( fileCache );
目前为止它可以工作
openApplication.HasExited()
中,HasExited不是一个函数。正确的方式应该是openApplication.HasExited
。 - caiosm1005 /// <summary>
/// Safe Try...
/// </summary>
/// <param name="processName"></param>
/// <param name="processList"></param>
/// <returns></returns>
public static bool ProcessIsAnyRunning(this string processName, out List<Process> processList)
{
processList = null;
var ret = !string.IsNullOrWhiteSpace(processName);
if (ret)
{
var processArr = Process.GetProcessesByName(processName);
ret = processArr.Length > 0;
if (ret)
{
processList = new List<Process>();
foreach (var process in processArr)
try
{
process.Refresh();
if (process.HasExited)
process.Dispose();
else
processList.Add(process);
}
catch
{
continue;
}
ret = processList.Count > 0;
}
}
return ret;
}