c# - 等待多个同步任务完成
问题描述
我想知道这是并行运行两个任务但不使用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 限制,我无法制作 mainExport()
方法async
/ 。await
解决方案
我认为您可以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
推荐阅读
- javascript - 导出为默认的多个导入模块
- android - 如何结合平移和缩放动画?
- c# - 找不到 Visual Studio 2015 构建类型或名称空间 cs0246
- python - 如何在 PyQt5 中从头开始制作按钮?
- jmeter - 如何在 Jmeter 5.1.1 上安装插件管理器
- android - 如何在 ROOM android 中修复“不确定如何将光标转换为此方法的返回类型”
- javascript - 如何发送 Ajax 请求而不被重定向?
- jitsi-meet - Jitsi-meet 从源代码编译,但在运行开发服务器时出错
- matlab - MATLAB 中的 HAC 标准错误
- php - 如果在表中找不到行,则使用连字符 (-) 显示数据 - php