如何设置动态并行任务执行而不是手动调用调用



在这种情况下,最好的方法是什么,其中有多个任务需要运行,具体取决于给定参数。请参阅下面的代码:

void Mapping() 
{
    if(param.IsProgram1) {
        //                   spGetProgram1() is a stored procedure call
        MapProgram1(context, spGetProgram1().GetIterator());
        if(param.IsProgram2) {
           MapProgram2(context, spGetProgram2().GetIterator());
        }
    }
    if(param.IsProgram3) {
       MapProgram3(context, spGetProgram23().GetIteratior());
    }
}

 static void MapProgram1(context, IEnumerable<IDataRecord> records) {
  // map records to context
 }
 static void MapProgram2(context, IEnumerable<IDataRecord> records) {
  // map records to context
 }
 static void MapProgram3(context, IEnumerable<IDataRecord> records) {
  // map records to context
 }

我想重构并并行运行任务。我当前的方法是将任务存储在字典中,并根据给定参数调用它

 var tasks = new Dictionary<string, Task<IEnumerable<IDataRecord>>>()
 {
            { "MapProgram1", null },
            { "MapProgram2", null },
            { "MapProgram3", null },
 }
 if(param.IsProgram1) tasks["MapProgram1"].Value = Task.Run(() => spGetProgram1().GetIterator())
 ... ...

 tasks.WaitAll(tasks.Select(t => t.Value).ToArray());

,然后获取结果,然后调用相应的映射方法

  foreach(var t in tasks.Where(t => t.Value != null))
        {
            if(t.Key == "MapProgram1")
            {
                MapProgram1(context, t.Value.Result);
            }
            if (t.Key == "MapProgram2")
            {
                MapProgram2(context, t.Value.Result);
            }
            .....
        }

我敢肯定有一种更干净的方法,我不需要手动调用方法。

我不确定我遵循您的示例;但是,总的来说,如果您想并行执行任务并有条件地选择要执行的任务,则可以执行类似的事情...

    async Task Run() {
        List<Task<IResult>> tasks = new List<Task<IResult>>();
        if (someCondition) {
            tasks.Add(RunSome(someParams));
        }
        if (othercondition) {
            tasks.Add(RunOther(otherParam));
        }
        IResult[] results = await Task.WhenAll(tasks);
        foreach (var result in results) {
            if (result is SomeResult someResult) {
                // Handle some result
            }
            else if (result is OtherResult otherResult) {
                // Handle other result
            }
        }
    }
    static async Task<SomeResult> RunSome(someParams) {
        // Run something
    }
    static async Task<OtherResult> RunOther(otherParams) {
        // Run other thing
    }
    interface IResult {
    }
    class SomeResult : IResult {
    }
    class OtherResult: IResult {
    }

您添加要在列表并行执行的任务,让每个任务返回某些结果类型的实例,然后在完成所有任务后检查结果。

您可以使用Parallel.ForEach进行很多操作,即调整并行性的程度,ECT

但是,这确实取决于您的工作负担以及您要实现的目标,但是这可能会给您带来思想的食物

var list = new List<Stuff>();
Parallel.ForEach(list, (item) =>
{
    switch(item,ConditionType)
    {
      case ConditionType.First : DoSomethingWithItem(item); break;
      case ConditionType.Second : DoSomethingElseWithItem(item); break;
    }
});

更多资源

并行。

msdn:如何:写一个简单的平行。

最新更新