如何在使用HttpClient时立即取消许多异步任务?

时间:2015-05-20 10:13:24

标签: c# task dotnet-httpclient

我有一个类似下面的课程。

class Service
{
    private HttpClient client;
    public Service()
    {
        client = new HttpClient();
        client.BaseAddress = new Uri("a uriString");  //"a uriString" refers to a real uri string.
        client.DefaultRequestHeaders.Add("Connection", "keep-alive");
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }
    public async Task<Result> DoSomeWork()
    {
        var post = new List<KeyValuePair<string, string>>();
        post.Add(new KeyValuePair<string, string>("key", "value")); //"key" "value" refers to real 
        var content = new FormUrlEncodedContent(post);
        try
        {
            var response = await client.PostAsync("requestUri", content);
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsAsync<Result>();
        }
        catch (HttpRequestException e)
        {
            return null;
        }
    }
}

在另一个UI类中,

Service service = new Service();

它还包含一个间隔为1秒的计时器。在Tick Handler方法中,有些代码如下:

async void testTimer_Tick(object sender, EventArgs e)
{
    await service.DoSomeWork();
}

在这个程序中,我想每秒向网站发布数据。我发现许多请求正在等待处理。如果10分钟过去了,我想立即开始另一个任务。我怎么能在之前取消一些任务? 如果我使用CancellationTokenSource类,我发现它也无法立即取消这么多任务。是否有像Thread.Abort()这样的方法来中止线程?或者我如何以其他方式完成此计划?谢谢。

1 个答案:

答案 0 :(得分:0)

  

如果我使用CancellationTokenSource课程,我发现它也无法立即取消这么多任务。

当然可以。 A single CancellationTokenSource cancels its own CancellationToken, and that same CancellationToken can be copied between multiple operationsCancellationTokenSource正是您应该使用的。

某些较高级HttpClient方法(例如GetStringAsync)不支持CancellationToken开箱即用,但Lucian Wischik有good blog post on adding that support