我们正在将所有或大部分 .NET 4.6 MVC WebAPI 控制器方法重构为async
方法。
这似乎适用于对可等待方法的较低级别调用的方法,例如 SQL 命令执行;但是,我们正在使用 Alachisoft 的内存分布式缓存框架,称为 NCache(确切地说是 4.6 SP2),它不提供任何真正的异步方法。
是否值得创建一个可以公开等待返回类型的async
辅助方法?Task<object>
传统上使用 NCache API,你Get
从缓存中获取一个对象,Key
在下面的用法中;
NCacheObject.Get(string);
建议是创建以下辅助方法;
protected static async Task<Object> GetAsync(string key, Cache nCache)
{
Task<Object> getTask = new Task<Object>(() => nCache.Get(key));
getTask.Start();
return await getTask.ConfigureAwait(false);
}
这样它就可以允许async
方法的完整瀑布流一直到入口控制器方法;
public static async Task<Tuple<List<SomeModel>, bool, string>> GetSomeModelList(string apiKey)
{
return newTuple<List<SomeModel>, bool, string>(await GetAsync("GetSomeModelKey", CacheInstance).ConfigureAwait(false), true, "Success message");
}
最后是控制器方法;
[HttpGet, Route("Route/Method")]
public async Task<ResponseOutputModel<List<SomeModel>>> GetSomeModelList()
{
ResponseOutputModel<List<SomeModel>> resp = new ResponseOutputModel<List<SomeModel>>();
try
{
Tuple<List<SomeModel>, Boolean, String> asyncResp = await CacheProcessing.GetSomeModelList(GetApiKey()).ConfigureAwait(false);
resp.Response = asyncResp.Item1;
resp.Success = asyncResp.Item2;
resp.Message = asyncResp.Item3;
}
catch (Exception ex)
{
LoggingHelper.Write(ex);
resp.StatusCode = Enumerations.ApiResponseStatusCodes.ProcessingError;
resp.Success = false;
resp.Message = ex.Message;
}
return resp;
}
这会使重构复杂化,因为原始方法实际上具有用于bool success
and的输出参数string message
;但似乎这可以使用Tuple<>
;以体面和快速的方式完成。否则我们可以创建一个返回类型模型。
要正确地做到这一点,将有数百种重构方法;相当的一项事业。
- 这会按预期工作,并且是实现目标的最佳解决方案吗?
- 是否值得付出所有必要的努力,最终目标是提高 Web 服务器的可扩展性和随后的“性能”?