WebApi并行函数编写求助:如何将并行调用结果返回至Ok返回类型
解决WebApi中并行调用结果传递给Ok返回的问题
首先,你当前用的Parallel.Invoke是用来执行多个无返回值的并行操作,它本身不会帮你收集返回结果。所以要获取ObjRepo.GetEmployee()的返回值,你需要先声明一个变量来存储结果,然后在并行委托里给这个变量赋值,最后把变量传给Ok()即可。
方法一:用变量存储Parallel.Invoke的执行结果
假设你的GetEmployee()返回的是Employee类型,代码可以改成这样:
public IHttpActionResult GetData() { Employee employeeResult = null; Parallel.Invoke(() => { employeeResult = ObjRepo.GetEmployee(); }); return Ok(employeeResult); }
这里要注意:如果是多个并行任务都要修改同一个变量,你需要考虑线程安全(比如用Interlocked或者线程安全容器),但你现在只调用了一个方法,所以直接赋值没问题。
方法二:更适合WebApi的异步并行方式
其实在WebApi中,更推荐用异步编程模型(Task-based)来做并行操作,这样不会阻塞服务器线程,性能更好。比如如果后续你要并行调用多个方法,用Task.WhenAll会更优雅:
public async Task<IHttpActionResult> GetData() { // 如果是单个异步方法,直接await即可 var employeeTask = Task.Run(() => ObjRepo.GetEmployee()); // 如果是多个并行任务: // var employeeTask = Task.Run(() => ObjRepo.GetEmployee()); // var departmentTask = Task.Run(() => ObjRepo.GetDepartment()); // await Task.WhenAll(employeeTask, departmentTask); var employeeResult = await employeeTask; return Ok(employeeResult); }
这种方式更符合WebApi的异步最佳实践,而且天然支持结果收集,不需要手动处理线程变量。
小提醒
如果你只需要调用单个方法,其实用Parallel.Invoke有点多余,直接调用或者用异步Task的方式更简洁。只有当你需要同时执行多个独立操作时,并行才会体现出价值。
内容的提问来源于stack exchange,提问作者user9430427
相关产品推荐
相关产品推荐

