Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现NCache-Get的可等待异步方法_C#_Asynchronous_Async Await_Ncache - Fatal编程技术网

C# 实现NCache-Get的可等待异步方法

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); 建议创

我们正在将所有或大部分.NET4.6MVCWebAPI控制器方法重构为
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;
    }