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

本文关键字:HttpClient 任务 何取消 取消 异步 许多 | 更新日期: 2023-09-27 17:50:15

我有一个像下面这样的类。

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()这样的方法来中止线程?或者我如何以另一种方式完成这个项目?谢谢你。

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

如果我使用CancellationTokenSource类,我发现它也不能立即取消这么多任务。

当然可以。单个CancellationTokenSource抵消它自己的CancellationToken,并且相同的CancellationToken可以在多个操作之间复制。CancellationTokenSource正是你应该使用的。

一些高级HttpClient方法(如GetStringAsync)不支持CancellationToken开箱,但Lucian Wischik有一篇很好的博客文章关于添加支持