等待多个同步任务完成

Waiting for multiple synchronous tasks to finish

我想知道这是 运行 两个并行任务但不使用 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

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

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