寻求更具可读性的.NET异步方法并行执行实现方案
可读性更强的异步并行执行方案,避免维护Task变量
我想找一种可读性更好的异步并行执行方案,不用维护Task对象再从中取结果——这种写法会拉低代码可读性。
我知道常规的并行运行两个异步方法的写法是这样的:
var t1 = RunAsync1(); var t2 = RunAsync2(); await Task.WhenAll(t1, t2); var result1 = t1.Result; var result2 = t2.Result;
我们的网站需要大量调用互不相关的外部服务API,我希望能提升其他开发者写的代码的可读性,避免到处都是t1、t2这类Task变量。
我自己想了个实现,但不确定是否合理:把ModelClass传入SetResultOfTask1和SetResultOfTask2这类方法里,会不会有内存泄漏之类的问题?
public async Task GetResult() { var model = new ModelClass(); await ExecuteInParallel(SetResultOfTask1(model), SetResultOfTask2(model)); //此时model.AsyncResult1和model.AsyncResult2应已赋值 } private async Task ExecuteInParallel(params Task[] tasks) { return Task.WhenAll(tasks); } private async Task SetResultOfTask1(ModelClass m) { m.AsyncResult1 = await GetAsync1(); } private async Task SetResultOfTask2(ModelClass m) { m.AsyncResult2 = await GetAsync2(); }
有没有其他可读性更强的实现方式?求建议!
更新
有人指出ExecuteInParallel方法没实际作用,可以移除来提升可读性。
我的核心需求是避免下面这种代码:
public async Task<ModelClass> GetModel() { var t1 = RunAsync1(); var t2 = RunAsync2(); var t3 = GetProductTypesAsync(); var t4 = GetUserInformationAsync(); await Task.WhenAll(t1, t2, t3, t4); var model = new ModelClass(); model.Type1 = t1.Result; model.Type2 = t2.Result; if (t3.Result == null) { //执行其他操作 } foreach (var productType in t4.Result) { //获取每个产品类型的更多信息 model.ProductTypes.Add(productType); } return model; }
转而用更具表达性的代码,让其他开发者能一眼看懂Model的构建逻辑:
public async Task<ModelClass> GetModel() { var model = new ModelClass(); //这四个方法彼此独立,仅需将结果存入ModelClass实例,因此我希望并行执行它们 await GetGeneralInformationAboutTheProduct(model); await LoadProductTypes(model); await LoadUserInformation(model); await LoadShoppingCartInformation(model); return model; }
内容的提问来源于stack exchange,提问作者Steven Lemmens
相关产品推荐
相关产品推荐

