我们正在将所有或大部分 .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 successand的输出参数string message;但似乎这可以使用Tuple<>;以体面和快速的方式完成。否则我们可以创建一个返回类型模型。
要正确地做到这一点,将有数百种重构方法;相当的一项事业。
- 这会按预期工作,并且是实现目标的最佳解决方案吗?
- 是否值得付出所有必要的努力,最终目标是提高 Web 服务器的可扩展性和随后的“性能”?