gpt4 book ai didi

c# - 为 NCache Get 实现 Awaitable 异步方法

转载 作者:太空宇宙 更新时间:2023-11-03 19:51:01 25 4
gpt4 key购买 nike

我们正在将所有或大部分 .NET 4.6 MVC WebAPI Controller 方法重构为 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 的完整瀑布方法到入口 Controller 方法;

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");
}

最后是 Controller 方法;

[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 的输出参数和 string message ;但似乎这可以使用 Tuple<> 以一种体面和快速的方式完成;否则我们只能创建一个返回类型模型。

要正确地做到这一点,需要重构数百种方法;这是一项艰巨的任务。

  1. 这是否会按预期工作,并且是实现目标的最佳解决方案?
  2. 为了提高网络服务器的可扩展性和随后的“性能”而付出的所有努力是否值得?

最佳答案

Would it be worth creating an async helper method that would expose a awaitable Task return type?

Nope .

The proposal is to create a helper method of the following

这只是将内存中的工作排队到线程池。

(旁注:永远不要使用任务构造函数。永远。如果您需要将工作排队到线程池,请使用 Task.Run 而不是带有 Start< 的任务构造函数)

Would this work as expected, and be the best solution to accomplish the objective?

Is it likely worth all of the effort required, with the end goal of increasing scalability and subsequently "performance" of the web servers?

这是同一个问题。目标是可扩展性;异步只是帮助您完成它的一种方法。

异步有助于 ASP.NET 的可伸缩性,因为它释放了可以处理其他请求的线程。但是,如果您使用另一个线程 创建异步方法,那么这对您根本没有帮助。我称之为“伪异步”——这些方法看起来是异步的,但它们实际上只是在线程池上同步运行。

与真正的异步相反,伪异步实际上会损害您的可扩展性。

关于c# - 为 NCache Get 实现 Awaitable 异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39520123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com