如何使用Parallel调用Task <T>列表

Fil*_* DO 1 c# class-library task-parallel-library async-await

我有一个按特定顺序排列的异步调用列表,无论哪个都先完成或最后完成.所有这些异步任务都返回位图.所有异步任务都返回一个Bitmap接受,它返回一个Bitmaps List列表.

出于测试目的,我能够更好地处理使用Parallel vs just Task的不同之处我需要有人向我展示如何调用这些async Task中的每一个并设置一个包含所有返回异步列表的局部变量结果.

  1. 如何并行执行这些任务
  2. 如何检索每个已完成任务的值并使用返回的结果设置局部变量.

---代码,我只是等待每个任务一个接一个.

public async static Task<PdfSharp.Pdf.PdfDocument> RollUpDrawingsPDF(IElevation elevation)
{

    List<Bitmap> allSheets = new List<Bitmap>();

    var processedParts = new PartsProcessor.PartProcessor().ProcessParts(elevation);

    //elevation
    allSheets.Add(await ShopDrawing.Manager.GetElevationDrawing(elevation, true, RotateFlipType.Rotate90FlipNone));

    //door schedules, 3 schedules per sheet
    allSheets.AddRange(await ShopDrawing.Door.GetDoorSecheduleSheets(elevation, RotateFlipType.Rotate90FlipNone, 3));

    //materials list
    allSheets.Add(await MaterialsList.Manager.GetMaterialList(processedParts).GetDrawing());

    //optimized parts
    allSheets.Add(await Optimization.Manager.GetOptimizedParts(processedParts).GetDrawing());

    //cut sheet
    allSheets.Add(await CutSheet.Manager.GetCutSheet(processedParts).GetDrawing());

    return await PDFMaker.PDFManager.GetPDF(allSheets, true);
}
Run Code Online (Sandbox Code Playgroud)

------ 代码我想在Parallel.ForEach中运行但是这不起作用,而是一个帮助的起点.对于每个返回的任务结果,我需要设置该并行任务结果的allSheets的局部变量.

    public async static Task<PdfSharp.Pdf.PdfDocument> RollUpDrawingsPDF(IElevation elevation)
{

    List<Bitmap> allSheets = new List<Bitmap>();

    var processedParts = new PartsProcessor.PartProcessor().ProcessParts(elevation);

    Task[] myTask = new Task[5];
    myTask[0] = ShopDrawing.Manager.GetElevationDrawing(elevation, true, RotateFlipType.Rotate90FlipNone);
    myTask[1] = ShopDrawing.Door.GetDoorSecheduleSheets(elevation, RotateFlipType.Rotate90FlipNone, 3);
    myTask[2] = MaterialsList.Manager.GetMaterialList(processedParts).GetDrawing();
    myTask[3] = Optimization.Manager.GetOptimizedParts(processedParts).GetDrawing();
    myTask[4] = CutSheet.Manager.GetCutSheet(processedParts).GetDrawing();



    var x = Parallel.ForEach(myTask, t => t.Wait());

    ////elevation
    //allSheets.Add(await );

    ////door schedules, 3 schedules per sheet
    //allSheets.AddRange(await);

    ////materials list
    //allSheets.Add(await );

    ////optimized parts
    //allSheets.Add(await );

    ////cut sheet
    //allSheets.Add(await );

    return await PDFMaker.PDFManager.GetPDF(allSheets, true);
}
Run Code Online (Sandbox Code Playgroud)

我如何为这段代码实现Parallel.ForEach?

*讨论代码示例.当其他方法返回一个Bitmap*时如何返回List

async Task<Bitmap[]> RollUpHelper(IElevation elevation, PartsProcessor.ProcessedParts       processedParts)
            {
                return await Task<Bitmap[]>.WhenAll(

 ShopDrawing.Manager.GetElevationDrawing(elevation, true, RotateFlipType.Rotate90FlipNone),
                     //ShopDrawing.Door.GetDoorSecheduleSheets(elevation,RotateFlipType.Rotate90FlipNone, 3),
                     MaterialsList.Manager.GetMaterialList(processedParts).GetDrawing(),
                     MaterialsList.Manager.GetMaterialList(processedParts).GetDrawing(),
                     CutSheet.Manager.GetCutSheet(processedParts).GetDrawing()
                      );

            }
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 6

Parallel.ForEach()用于并行运行多个同步操作.

您希望等待多个异步 Task s完成:

await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)