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 .....
    }

Process.GetProcessesByName in BackgroundWorker

我不知道为什么,但我找到了原因。显示此行为的程序需要在.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位版本的新操作系统中,尽管我对此表示怀疑。