我很擅长处理HTTP内容,所以我很困惑,每隔几秒左右从HTTP地址请求数据的最佳方法是什么。
我使用的API - 至少据我所知,没有webhook支持。因此,我认为更新数据的方式将是一种相当粗略的方式。
我希望这在后台发生,因此GUI不会冻结并且无法响应。所以我知道我(可能)需要摆弄线程。
我曾经使用异步/等待计时器的最佳结果。我不完全确定如何使用它,并且让它工作的唯一方法是在它过去之后抛出异常。如果我不 - 它说并非所有节点都返回一个值,我甚至无法使用返回,这真的让我很困惑。
我该怎么做?
如果它有用,我正在为一款游戏创建我自己的RCON工具,该游戏具有通过HTTP API提供的各种服务器数据 - 但是这个API的文档非常乏味。
答案 0 :(得分:0)
如果你去.net核心,你可以看到我之前的答案:Start multiple background threads inside Self Hosted ASP.NET Core Microservice
对于.net框架,你必须自己多做一点。但仍然非常可行!
你在global.asax中的(或者我应该说:应该)你的依赖注入。类似的东西:
protected void Application_Start()
{
Bootstrap();
//and do something more
}
private static void Bootstrap()
{
var container = new Container();
container.Register(() => new HttpClient());
container.RegisterSingleton<IApiCaller, ApiCaller>();
container.RegisterInitializer<IApiCaller>(ApiCaller=> apicaller.StartCallingAsync());
// Suppress warnings for HttpClient
var registration = container.GetRegistration(typeof(HttpClient)).Registration;
registration.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, "Dispose is being called by code.");
registration.SuppressDiagnosticWarning(DiagnosticType.LifestyleMismatch, "Every HttpCient is unique for each dependency.");
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
}
在这种情况下,我让SimpleInjector启动我的后台线程做了很多工作。 在apicaller中你可以做你的httpcalls。
类似的东西:
public async Task StartCallingAsync(CancellationToken cancellationToken = (default)CancellationToken)
{
while(true)
{
var response = await _httpClient.GetAsync(url);
if (response.IsSuccessStatusCode)
{
//do work
}
await Task.Delay(10000, cancellationToken);
}
}
对于GetAsync
,有扩展方法可以直接将其强制转换为您的对象。