BackgroundWorker中的Process.GetProcessesByName

时间:2015-11-13 18:38:08

标签: c# .net multithreading

我遇到了与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 .....
    }

1 个答案:

答案 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位版本的新操作系统中,尽管我对此表示怀疑。