c# - Web API 中的线程最佳实践
问题描述
我有一个简单的 Web API,只有一个GET
控制器。GET 控制器读取 XML 数据并以 JSON 格式返回。
GET
API 应该每分钟都超过一次,但如果超过 1 分钟没有 GET 请求,那么我需要开始备份数据(只是 XML 格式..没什么花哨的)。
我的 GET API
//GET api/
public IHttpActionResult Get()
{
try
{
//Read XML
XDocument xDoc = XDocument.Load(@"D:\myfile.xml");
//Convert XML data into JSON string
string jsonStr = JsonConvert.SerializeXNode(xDoc);
JObject json = JObject.Parse(jsonStr);
return Ok(json);
}
catch (Exception ex)
{
return NotFound();
}
}
示例 XML:
<CurrentStatus>
<Time Stamp= "20181011133631244">
<price>12</price>
<amount>100</amount>
</Time>
</CurrentStatus>
XML 中的示例备份:
<CurrentStatus>
<Time Stamp= "20181011133631244">
<price>12</price>
<amount>100</amount>
</Time>
<Time Stamp= "20181011133633354">
<price>11</price>
<amount>120</amount>
</Time>
<Time Stamp= "20181011133633204">
<price>15</price>
<amount>90</amount>
</Time>
</CurrentStatus>
我的计划逻辑:我打算声明一个static
变量_lastAccessedTimestamp
,它将由一个单独的线程监控。如果currentTime - _lastAccessedTimestamp
>1 min
则开始备份数据。
问题:在这种情况下在 Web API 中实现线程的良好做法(或任何其他更好的选择)?
PS: Web Service 将在 localhost IIS 服务器上运行。
解决方案
每次请求后,我都会设置/重置一个计时器 1 分钟。拥有从不同线程轮询的变量效率不高,并且会引发其他问题。
更重要的是,您可以使用适当的作业处理库(例如 Hangfire - https://www.hangfire.io/),这样您就可以安排作业(1分钟后)并在每次请求后重新安排它,以防有新请求来了。
请注意,IIS 可以随时停止您的进程,您可能需要对此进行调查。 http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html
对于实现,您可以使用在每个请求结束时自动执行此操作的中间件/过滤器。无需在控制器中添加它。在不复制代码的情况下添加多个控制器也更容易。
推荐阅读
- php - How to create a composer package for a Nova Resource
- python - 错误:缺少 2 个必需的位置参数
- python - 如何在kivy Python中从用户选择的文件中提取文件路径
- java - 用于嵌套哈希图的 Graphql 架构
- java - 如何在 HarmonyOS 中更改从一个 AbilitySlice 到另一个 AbilitySlice 的过渡动画?
- google-api - Web 应用程序在本地和应用程序引擎上工作,但不能在云上运行
- javascript - 如何实例化从函数返回的类?
- android - 无法构建发布版本
- c# - 如何在 c# 中使用统一组合网格并获取相对于主父级的点击位置
- sorting - lua表排序数据