У меня есть список асинхронных вызовов, которые выстроены в определенном порядке, и не имеет значения, какой из них завершится первым или последним. Все эти асинхронные задачи возвращают растровые изображения. Все асинхронные задачи возвращают одно Bitmap accept для одного и возвращает список Bitmaps List.
Для целей тестирования и для того, чтобы я мог лучше понять разницу между использованием Parallel и просто Task, мне нужен кто-то, чтобы показать мне, как вызывать каждую из этих асинхронных задач и устанавливать локальную переменную, которая содержит список всех возвращенных async Результаты.
- Как выполнять параллельную работу для каждой из этих задач
- Как получить значение каждой выполненной задачи и установить локальную переменную с возвращенным результатом.
--- Код, в котором я просто жду каждую задачу одну за другой.
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);
}
------ Код, который я пытаюсь запустить в 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);
}
Как мне реализовать Parallel.ForEach для этого фрагмента кода?
* Пример кода обсуждения. Как вернуть список, когда другие методы возвращают одно растровое изображение *
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()
);
}
async
для этого? В противном случае это относительно легко сделать с помощьюParallel.Invoke()
- person Matthew Watson   schedule 07.06.2013GetDrawing()
(правильно) асинхронный, то да. - person SLaks   schedule 07.06.2013Task.WhenAll()
, который возвращает массив результаты - это то, о чем вы, конечно же, говорили. - person Matthew Watson   schedule 07.06.2013