首页 > 解决方案 > 等待多个同步任务完成

问题描述

我想知道这是并行运行两个任务但不使用async/的最佳方法await

public string Export()
{
    var ifcFilePaths = ExportIfcFiles().ToList();
    Task<List<IfcToCsvGraphExportResult>> graphConverterResults = ConvertIfcToGraphData(ifcFilePaths);
    Task<List<IfcToGltfConversionResult>> gltfConverterResults = ConvertIfcToGltfData(ifcFilePaths);
    List<string> folders = _outputFolderPacker.Pack(graphConverterResults.Result, gltfConverterResults.Result).ToList();

    return _zipPacker.Pack(folders);
}

private Task<List<IfcToCsvGraphExportResult>> ConvertIfcToGraphData(List<string> ifcFilePaths)
    => Task.Run(() => _ifcToCsvGraphExporter.Export(ifcFilePaths).ToList());

private Task<List<IfcToGltfConversionResult>> ConvertIfcToGltfData(List<string> ifcFilePaths)
    => Task.Run(() => _ifcToGltfConverter.Convert(ifcFilePaths).ToList());

我希望ConvertIfcToGraphDataConvertIfcToGltfData方法并行运行,但另一方面我希望 _outputFolderPacker.Pack()方法在处理之前等待两个结果。我的问题是由于某些 API 限制,我无法制作 mainExport()方法async/ 。await

标签: c#tasktask-parallel-library

解决方案


我认为您可以Task.WaitAll()在运行任务之后和从Export函数返回之前使用。

public string Export()
{
    var ifcFilePaths = ExportIfcFiles().ToList();
    Task<List<IfcToCsvGraphExportResult>> graphConverterResults = ConvertIfcToGraphData(ifcFilePaths);
    Task<List<IfcToGltfConversionResult>> gltfConverterResults = ConvertIfcToGltfData(ifcFilePaths);
    
    // This is the missing part
    Task.WaitAll(new[] {graphConverterResults, gltfConverterResults});
    
    List<string> folders = _outputFolderPacker.Pack(graphConverterResults.Result, gltfConverterResults.Result).ToList();

    return _zipPacker.Pack(folders);
}

可以在 Microsoft 文档页面上找到一些详细信息:https ://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.waitall?view=net-5.0


推荐阅读