c# - 如何使用多个 await 正确编写健壮的异步代码

标签 c# .net async-await

对于我在下面得到的代码,重写此代码以使其更健壮的推荐方法是什么?

我试图让这个更好地理解 await async。

如果您在下面的代码中注意到我正在等待两种方法,以便将一个结果添加到 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());
    }

附加问题

对于像下面这样的标签,它返回一个列表。我如何让它工作?将磅添加到 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));
    }

最佳答案

您可以只启动多个 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();
}

关于c# - 如何使用多个 await 正确编写健壮的异步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19302128/

相关文章:

c# - visual studio express 2012 中的 PowerPacks 命名空间错误

c# - 如何让 .NET Windows 服务检测登录、注销和切换用户事件?

Javascript:抛出异步链式方法

javascript - MVC Razor 中的 DropBox

.net - Wpf 用户控件和 MVVM

c# - Web API 路由被忽略

c# - 长时间运行的任务与线程——性能

node.js - NodeJS SetInterval 与 Async/Await

c# - 如何找到 C# 项目中的所有硬编码值(解决方案)?

c# - Azure Function 上带参数的两个计时器触发器