我想知道这是并行运行两个任务但不使用 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());
我希望 ConvertIfcToGraphData
和 ConvertIfcToGltfData
方法并行运行,但另一方面我希望 _outputFolderPacker.Pack()
方法在处理之前等待两个结果。我的问题是由于某些 API 限制,我无法创建主 Export()
方法 async
/await
。
答案 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