我正在使用 .Net 的 HttpClient
请求一个 REST API(GET)。我想使用长轮询 long polling 调用此 API。
我有几个问题:
- 使用长轮询检索数据的最佳方法是什么?
- 这是我的用例 - 我的应用程序将使用长轮询来消耗此API,根据结果,我将在不同的线程上执行一些操作。根据长轮询获取的新响应,我将中止/完成旧线程,并再次启动新线程进行操作。如何使用任务实现此目标?
我正在使用 .Net 的 HttpClient
请求一个 REST API(GET)。我想使用长轮询 long polling 调用此 API。
我有几个问题:
对于第一个问题,我找到了这个解决方案,它工作得相当好:
var url = "http://your.url";
using (var client = new HttpClient())
{
client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
var request = new HttpRequestMessage(HttpMethod.Get, url);
using (var response = await client.SendAsync(
request,
HttpCompletionOption.ResponseHeadersRead))
{
using (var body = await response.Content.ReadAsStreamAsync())
using (var reader = new StreamReader(body))
while (!reader.EndOfStream)
Console.WriteLine(reader.ReadLine());
}
}
长轮询线程的唯一工作是处理长轮询调用的结果。当接收到响应时,它会检查结果并根据结果激活其他线程,然后启动一个新的长轮询请求。这意味着它能够在其他工作线程处理任务时接收新任务。
正如所说,您可以拥有多个不同的工作线程,执行不同的任务。移动文件、安装应用程序、删除非法应用程序、备份文件夹等等。天空真的是极限。
这基本上是我的系统的基本设计,它运行得非常好。它简单易用。
var socketsHandler = new SocketsHttpHandler
{
PooledConnectionIdleTimeout = TimeSpan.FromHours(27),//Actually 5 mins can be idle at maximum. Note that timeouts longer than the TCP timeout may be ignored if no keep-alive TCP message is set at the transport level.
MaxConnectionsPerServer = 10
};
client = new HttpClient(socketsHandler);
正如您所看到的,尽管我将空闲超时设置为27小时,但实际上它只能保持5分钟。
因此,最终我每1分钟使用相同的HttpClient调用目标终端点。在这种情况下,总是存在一个已建立的连接。您可以使用netstat进行检查。