等待多个同步任务完成

时间:2021-05-11 21:26:39

标签: c# task task-parallel-library

我想知道这是并行运行两个任务但不使用 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 限制,我无法创建主 Export() 方法 async/await

1 个答案:

答案 0 :(得分:3)

我认为您可以在运行任务之后和从 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