对于我下面的代码,重写此代码的建议方法是什么?
我试图更好地理解等待异步。
如果您在下面的代码中注意到,我正在等待两种方法,以便将一个结果添加到allSheets。
我可以做些什么来从下面的代码中获得更好的性能。我需要这些方法调用同时运行所有,而不是一个接一个地运行,接受并行排列的那些;显然第一种方法必须返回一个结果,以便调用等待结果的方法。
async static Task<List<Bitmap>> BuildSheetsAsync(Guid userID, IElevation elevation, bool includeLabels)
{
var processedParts = await new PartsProcessor.PartProcessor().ProcessParts(userID, elevation, false);
processedParts.Elevation = elevation;
List<Bitmap> allSheets = new List<Bitmap>();
//materials list
allSheets.Add(await (await MaterialsList.Manager.GetMaterialListAsync(processedParts)).GetDrawingAsync());
//optimized parts
allSheets.Add(await (await Optimization.Manager.GetOptimizedPartsAsync(processedParts)).GetDrawingAsync());
//cut sheet
processedParts = await new PartsProcessor.PartProcessor().ProcessParts(userID, elevation, true);
processedParts.Elevation = elevation;
allSheets.Add(await CutSheet.Manager.GetCutSheet(processedParts).GetDrawingAsync());
}
其他问题
对于如下标签的情况,它返回一个List。我如何让它工作?当我将lbls添加到allSheets.AddRange时,我收到错误。
//labels
if (includeLabels)
{
var lbls = GetGetLabelsDrawingAsync(processedParts);
allSheets.AddRange(await Task.WhenAll(materialsList, optimizedParts, cutSheet, lbls));
}
else
{
allSheets.AddRange(await Task.WhenAll(materialsList, optimizedParts, cutSheet));
}
return allSheets;
}
static async Task<List<Bitmap>> GetGetLabelsDrawingAsync(ProcessedParts processedParts)
{
var list = await AlumCloudPlans.Manager.GetLabelsAsync(processedParts);
return await list.GetSheets(new SheetInfo(3, 10, 240, 90, 780, 980));
}
答案 0 :(得分:4)
您可以启动多个Task
,然后使用Task.WhenAll
:
var materials = GetMaterialDrawingAsync(processedParts);
var optimized = GetOptimizedDrawingAsync(processedParts);
var cut = GetCutDrawingAsync(processedParts);
allSheets.AddRange(await Task.WhenAll(materials, optimized, cut));
请注意删除序列async
的简化await
方法(稍微简化代码):
static async Task<Sheet> GetMaterialDrawingAsync(ProcessedParts processedParts)
{
var list = await MaterialsList.Manager.GetMaterialListAsync(processedParts);
return await list.GetDrawingAsync();
}