提高绩效 - 也许是并行实施

时间:2017-12-09 10:05:33

标签: c# parallel-processing

我们有一个Visual Studio 2017扩展,它在VS中创建一个解决方案,将数据库中的文件加载到创建的项目中然后编译它。

这需要几分钟,我想更快地完成。 我知道那里有工具,我只是不知道谷歌的确切内容。 所以我不希望有人重写我的代码(虽然一个简单的例子会很棒!)但是我可以使用的一些指导会非常有帮助。

所以这里我们有创建解决方案的方法,并负责将数据库中的文件加载到其中:

public void LoadFilesIntoVS()
    {
        CreateSolution();
        LoadCalcFiles();
        LoadTemplateFiles();
        LoadAdvancedCalcFiles();
        LoadOtherFilesIntoSolution();
    }

四种Load XYZ 方法类似,所以我将继续使用LoadCalcFiles()的示例。

public void LoadCalcFiles()
    {
        CalcFilesList = new ObservableCollection<CalcFile>(BuilderService.GetAllCalcFiles());

        foreach (CalcFile file in CalcFilesList)
        {
            LoadCalcFileIntoSolution(file);
        }
    }

LoadCalcFileIntoSolution:

private void LoadCalcFileIntoSolution(CalcFile file)
    {
        try
        {
        string sourcePath = BuilderService.GetCalcFileSourcePath(file.ID);
        string fullName = sourcePath.Substring(sourcePath.LastIndexOf("\\") + 1);
        if (!calcObjects.ContainsKey(fullName))
        {              

            if (!File.Exists(sourcePath))
            {
                BuilderService.GenerateCalcFileMethod(file.ID);
            }

            ProjectItem calcFile = LoadAsProjectItem(sourcePath);
            calcObjects.Add(fullName, file);
        }
      }
        catch (Exception e)
        {
            SetErrorStatus("Problem loading CalcFile into Solution. " + e.Message);
        }
    }

所以是的,我听说过平行的foreach。在LoadCalcFiles中使用它会有好处吗? 另外,我可以在创建解决方案后以某种方式同时运行四个Load XYZ 方法吗?

2 个答案:

答案 0 :(得分:0)

试试这个:

public void LoadFilesIntoVS()
    {
        CreateSolution();
        new Thread(LoadCalcFiles).        Start();
        new Thread(LoadTemplateFiles).    Start();
        new Thread(LoadAdvancedCalcFiles).Start();
        LoadOtherFilesIntoSolution();
    }

答案 1 :(得分:0)

LoadFilesIntoVS()的最简单更改可能是:

    Parallel.Invoke(
        () => CreateSolution(),
        () => LoadCalcFiles(),
        () => LoadTemplateFiles(),
        () => LoadAdvancedCalcFiles(),
        () => LoadOtherFilesIntoSolution()
    );

这样你保持int同步。

但是所有文件都预先使用了吗?否则,您应该考虑Lazy<CalcFile>中的CalcFilesList,因此首次使用时会首先加载文件。它是线程安全的,你的引导时间将接近于零。