如何取消许多异步任务立即当我使用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()
这样的方法来中止线程?或者我如何以另一种方式完成这个项目?谢谢你。
如果我使用
CancellationTokenSource
类,我发现它也不能立即取消这么多任务。
当然可以。单个CancellationTokenSource
抵消它自己的CancellationToken
,并且相同的CancellationToken
可以在多个操作之间复制。CancellationTokenSource
正是你应该使用的。
一些高级HttpClient
方法(如GetStringAsync
)不支持CancellationToken
开箱,但Lucian Wischik有一篇很好的博客文章关于添加支持