在后台循环HTTP请求?

时间:2017-11-03 08:07:11

标签: c# multithreading loops http timer

我很擅长处理HTTP内容,所以我很困惑,每隔几秒左右从HTTP地址请求数据的最佳方法是什么。

我使用的API - 至少据我所知,没有webhook支持。因此,我认为更新数据的方式将是一种相当粗略的方式。

我希望这在后台发生,因此GUI不会冻结并且无法响应。所以我知道我(可能)需要摆弄线程。

我曾经使用异步/等待计时器的最佳结果。我不完全确定如何使用它,并且让它工作的唯一方法是在它过去之后抛出异常。如果我不 - 它说并非所有节点都返回一个值,我甚至无法使用返回,这真的让我很困惑。

我该怎么做?

如果它有用,我正在为一款游戏创建我自己的RCON工具,该游戏具有通过HTTP API提供的各种服务器数据 - 但是这个API的文档非常乏味。

1 个答案:

答案 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,有扩展方法可以直接将其强制转换为您的对象。

你可以用这个吗?