C# 实现NCache-Get的可等待异步方法
我们正在将所有或大部分.NET4.6MVCWebAPI控制器方法重构为C# 实现NCache-Get的可等待异步方法,c#,asynchronous,async-await,ncache,C#,Asynchronous,Async Await,Ncache,我们正在将所有或大部分.NET4.6MVCWebAPI控制器方法重构为async方法 这似乎适用于具有较低级别的方法调用(如SQL命令执行)的方法;然而,我们正在利用Alachisoft的一个名为NCache(确切地说是4.6 SP2)的内存中分布式缓存框架,它不提供任何真正的异步方法 是否值得创建一个asynchelper方法来公开一个等待的Task返回类型 传统上使用NCache API时,您可以使用键从缓存中获取对象,用法如下: NCacheObject.Get(string); 建议创
async
方法
这似乎适用于具有较低级别的方法调用(如SQL命令执行)的方法;然而,我们正在利用Alachisoft的一个名为NCache(确切地说是4.6 SP2)的内存中分布式缓存框架,它不提供任何真正的异步方法
是否值得创建一个async
helper方法来公开一个等待的Task
返回类型
传统上使用NCache API时,您可以使用键从缓存中获取对象,用法如下:
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);
}
最后介绍了控制方法
[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;
}
[HttpGet,Route(“Route/Method”)]
公共异步任务GetSomeModelList()
{
ResponseOutputModel resp=新ResponseOutputModel();
尝试
{
Tuple asyncResp=await CacheProcessing.GetSomeModelList(GetApiKey()).ConfigureAwait(false);
响应=异步响应项1;
resp.Success=asyncResp.Item2;
resp.Message=asyncResp.Item3;
}
捕获(例外情况除外)
{
LoggingHelper.Write(ex);
resp.StatusCode=Enumerations.apirresponseStatusCodes.ProcessingError;
相应的成功=错误;
响应消息=例如消息;
}
返回响应;
}
这将使重构复杂化,因为原始方法实际上有boolsecess
和stringmessage
的输出参数;但这似乎可以通过使用元组以体面而快速的方式实现;否则,我们可以创建一个返回类型模型
要正确地做到这一点,将有数百种方法进行重构;这是一项相当艰巨的任务
这是否如预期的那样有效,并且是实现目标的最佳解决方案
为了提高web服务器的可伸缩性和随后的“性能”,是否值得付出所有必要的努力
因为这是一个内存缓存,我这么说是因为我有直接使用NCache的经验,但有使用其他缓存系统的经验
是的,这当然行。我宁愿选择一个响应结构或一个允许我定义响应类型的泛型类(如果可能的话)。元组还不错,如果您选择类,可能会更有效。但它们在眼睛上并不容易
现在,当谈到性能时,有一个问题。这里有一个缓存服务器,当然你需要快速读写。访问memcache应该很容易。由于您直接访问内存,从性能的角度来看,它不会给您带来太多。您是否确保您的代码是完全异步的,并且您正确地使用了线程池来确保一切正常?是的,当然,但它所能做的就是在访问缓存时添加一个额外的层或工作李>
在您选择异步时,请确保您的内存缓存是线程安全的。:)李>
因为这是一个内存缓存,我这么说是因为我有直接使用NCache的经验,但有使用其他缓存系统的经验
是的,这当然行。我宁愿选择一个响应结构或一个允许我定义响应类型的泛型类(如果可能的话)。元组还不错,如果您选择类,可能会更有效。但它们在眼睛上并不容易
现在,当谈到性能时,有一个问题。这里有一个缓存服务器,当然你需要快速读写。访问memcache应该很容易。由于您直接访问内存,从性能的角度来看,它不会给您带来太多。您是否确保您的代码是完全异步的,并且您正确地使用了线程池来确保一切正常?是的,当然,但它所能做的就是在访问缓存时添加一个额外的层或工作李>
在您选择异步时,请确保您的内存缓存是线程安全的。:)李>
是否值得创建一个异步帮助器方法来公开可等待的任务返回类型
建议创建以下帮助器方法
这只是将内存中的工作排队到线程池
(旁注:永远不要使用任务构造函数。永远不要。如果需要将工作排队到线程池,请使用task.Run
,而不是使用Start
的任务构造函数)
这是否如预期的那样有效,并且是实现目标的最佳解决方案
为了提高web服务器的可伸缩性和随后的“性能”,是否值得付出所有必要的努力
这是同一个问题。目标是可伸缩性;异步只是帮助您实现它的一种方法
异步有助于ASP.NET上的可伸缩性,因为它释放了一个可以处理其他请求的线程。但是,如果您使用另一个线程来创建异步方法,那么这对您毫无帮助。我称之为“伪异步”——这类方法看起来是异步的,但实际上只是在线程池上同步运行
与真正的异步相比,虚假的异步实际上会损害您的可伸缩性
是否值得创建一个异步帮助器方法来公开可等待的任务返回类型
建议创建以下帮助器方法
这只是将内存中的工作排队到线程池
(旁注:永远不要使用任务构造函数。永远不要。如果需要将工作排队到线程池,请使用task.Run
,而不是使用Start
的任务构造函数)
这会像预期的那样起作用,并且是最好的选择吗
[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;
}