我遇到了与BackgroundWorker对象相关的问题,并且没有足够的C#经验来了解正在发生的事情。该程序是一个场外修补实用程序。它工作正常,但我没有正确更新UI,因为处理和UI循环在同一个线程中,所以我正在考虑将处理移动到BackgroundWorker中。
由于正在修补可执行文件,因此修补过程会检查以确保它们在复制文件之前未运行。我看到的问题是Process.GetProcessesByName。如果我在 bg_InstallPatch 中运行Process.GetProcessesByName,它似乎工作正常,如果我从 handleLocalRunningProcesses 方法中调用它“无法从性能计数器获取进程信息”。抛出异常,我找不到任何关于原因的文档。在调用方法时,是否需要在Form上运行 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 .....
}
答案 0 :(得分:1)
我不知道为什么,但我找到了原因。显示此行为的程序需要在.NET 3.5下的.NET 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位版本的新操作系统中,尽管我对此表示怀疑。