Process.GetProcessesByName in BackgroundWorker
本文关键字:BackgroundWorker in GetProcessesByName Process | 更新日期: 2023-09-27 18:21:54
我遇到了一个与BackgroundWorker对象有关的问题,并且没有足够的C#经验来理解发生了什么。该程序是一个非现场补丁实用程序。它可以工作,但我认为UI没有正确更新,因为处理和UI循环在同一个线程中,所以我正在考虑将处理转移到BackgroundWorker中。
由于正在修补可执行文件,因此在复制文件之前,修补过程会进行检查以确保它们没有运行。我看到的问题是Process.GetProcessesByName。如果我在bg_InstallPatch中运行Process.GetProcessorsByName,它似乎可以正常工作,如果我从handleLocalRunningProcesses方法中调用它,则会引发"无法从性能计数器获取进程信息"异常,我找不到任何关于原因的文档。调用方法时是否需要执行类似于在窗体上运行Invoke的操作?
我拥有的最高.NET运行时级别是3.5。
private void handleLocalRunningProcesses(bool killIfFound = true)
{
logger.Debug("Looking up local processes");
String[] filesToUpload = files.Split(',');
foreach (String file in filesToUpload)
{
String[] fileName = file.Split('.');
logger.Debug("Checking " + fileName[0]);
/******** V Exception Throw Here V ********/
foreach (Process proc in Process.GetProcessesByName(fileName[0]))
try
{
int pid = proc.Id;
logger.Info("Process " + pid + " found running for " + file);
if (killIfFound)
try
{
logger.Info("Attempting to kill process " + pid);
proc.Kill();
if (!proc.WaitForExit(TIMEOUT_KILL_IN_MILLIS))
throw new ApplicationException(String.Format(ERROR_PROCESS_RUNNING, pid, "localhost"));
else
logger.Info("Process has been terminated.");
}
catch (Exception e)
{
logger.Error(e.Message, e);
throw new ApplicationException(String.Format(ERROR_PROCESS_RUNNING, pid, "localhost"));
}
}
finally
{
proc.Dispose();
}
}
logger.Debug("Finished looking up local processes");
}
public void bg_InstallPatch(Object sender, DoWorkEventArgs ea)
{
try
{
//..... Other Code .....
if (updateLocal)
{
logger.Info("Starting Local Updates");
/***Testing***/
logger.Debug("2Looking up local processes");
String[] filesToUpload = files.Split(',');
foreach (String file in filesToUpload)
{
String[] fileName = file.Split('.');
logger.Debug("2Checking " + fileName[0]);
/****** This works fine ******/
foreach (Process proc in Process.GetProcessesByName(fileName[0]))
try
{
int pid = proc.Id;
logger.Info("2Process " + pid + " found running for " + file);
}
finally
{
proc.Dispose();
}
}
/******/
handleLocalRunningProcesses(true);
//..... More Code .....
}
//..... More Code .....
}catch (Exception e)
{
logger.Error("Error installing patch", e);
throw e;
}
}
public void installPatch()
{
//..... Unrelated Code ....
logger.Info("Starting patch installation");
BackgroundWorker patcher = new BackgroundWorker();
patcher.DoWork += new DoWorkEventHandler(bg_InstallPatch);
patcher.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_ProgressClose);
patcher.RunWorkerAsync(bar);
//..... More Code .....
}
我不知道为什么,但我找到了原因。显示此行为的程序需要在.NET 3.5下的Windows XP上运行。在安装了.NET 4.5.1的Windows 10上运行时,此问题不再出现。在安装了.NET 3.5的Windows 8.0上进行的第二次测试也起到了作用。已验证该程序在安装了.NET 3.5的第二个不相关的XP环境中是否继续失败。所有测试都使用了相同的可执行文件。
尽管该程序被编译为32位可执行文件,但仍然应该指出的是,XP是32位的,Windows 8和10都是64位的。万一这种行为会出现在32位版本的新操作系统中,尽管我对此表示怀疑。