等待多个同步任务完成
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());
我希望 ConvertIfcToGraphData
和 ConvertIfcToGltfData
方法与 运行 并行,但另一方面我希望 _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
我想知道这是 运行 两个并行任务但不使用 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
。
我认为您可以在 运行 任务之后和从 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