首页 > 解决方案 > Web API 中的线程最佳实践

问题描述

我有一个简单的 Web API,只有一个GET控制器。GET 控制器读取 XML 数据并以 JSON 格式返回。

GETAPI 应该每分钟都超过一次,但如果超过 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 服务器上运行。

标签: c#multithreadingrestasp.net-web-api

解决方案


每次请求后,我都会设置/重置一个计时器 1 分钟。拥有从不同线程轮询的变量效率不高,并且会引发其他问题。

更重要的是,您可以使用适当的作业处理库(例如 Hangfire - https://www.hangfire.io/),这样您就可以安排作业(1分钟后)并在每次请求后重新安排它,以防有新请求来了。

请注意,IIS 可以随时停止您的进程,您可能需要对此进行调查。 http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html

对于实现,您可以使用在每个请求结束时自动执行此操作的中间件/过滤器。无需在控制器中添加它。在不复制代码的情况下添加多个控制器也更容易。


推荐阅读