【问题标题】:Invoke methods in parallel based on condition根据条件并行调用方法
【发布时间】:2019-02-23 07:37:58
【问题描述】:
public IList<Student> GetStudentList()
{
    var students = new List<Student>();
    if(getOtherSchoolStudents)
    {
        var otherSchoolStudents  = GetOtherSchoolStudents();
        students.AddRange(otherSchoolStudents);
    }
    var currentSchoolStudents = GetCurrentSchoolStudents();
    students.AddRange(currentSchoolStudents)
    return students;
}

这里当getOtherSchoolStudentstrue 时,我想并行运行GetOtherSchoolStudents()GetCurrentSchoolStudents() 方法。我知道我可以将GetCurrentSchoolStudents() 移到条件范围内并同时运行,如下所示

public IList<Student> GetStudentList()
{
    var students = new List<Student>();
    if(getOtherSchoolStudents)
    {
        var otherSchoolStudents  = GetOtherSchoolStudents(); // run in parallel
        var currentSchoolStudents = GetCurrentSchoolStudents(); // run in parallel
        students.AddRange(otherSchoolStudents);
        students.AddRange(currentSchoolStudents)
    }
    else
    {
        var currentSchoolStudents = GetCurrentSchoolStudents(); 
        students.AddRange(currentSchoolStudents);
    }
    return students;
}

还有其他方法吗?

【问题讨论】:

    标签: c# asynchronous parallel-processing async-await task-parallel-library


    【解决方案1】:

    最简单的方法可能是并行调用两个 get 操作:

    public IList<Student> GetStudentList()
    {
        List<Student> currentSchoolStudents;
        List<Student> otherSchoolStudents; 
    
        Parallel.Invoke(
        { currentSchoolStudents = GetCurrentSchoolStudents(); }
        { otherSchoolStudents = getOtherSchoolStudents 
                              ? GetOtherSchoolStudents() 
                              : new List<Student>(); }
        );
    
        var students = new List<Student>();
        students.AddRange(otherSchoolStudents);
        students.AddRange(currentSchoolStudents)
        return students;
    }
    

    这假设您的操作返回 List&lt;Student&gt;,如果它们返回其他内容,例如 Student[],您需要相应地更改类型。

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 2022-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2021-11-21
      • 1970-01-01
      相关资源
      最近更新 更多