我有一个类似下面的课程。
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()
这样的方法来中止线程?或者我如何以其他方式完成此计划?谢谢。
答案 0 :(得分:0)
如果我使用
CancellationTokenSource
课程,我发现它也无法立即取消这么多任务。
当然可以。 A single CancellationTokenSource
cancels its own CancellationToken
, and that same CancellationToken
can be copied between multiple operations。 CancellationTokenSource
正是您应该使用的。
某些较高级HttpClient
方法(例如GetStringAsync
)不支持CancellationToken
开箱即用,但Lucian Wischik有good blog post on adding that support。