【发布时间】:2017-09-23 13:43:04
【问题描述】:
我对异步任务有点陌生。
我有一个函数,它可以获取学生 ID 并从具有所需 ID 的特定大学网站上抓取数据。
private static HttpClient client = new HttpClient();
public static async Task<Student> ParseAsync(string departmentLink, int id, CancellationToken ct)
{
string website = string.Format(departmentLink, id);
try
{
string data;
var stream = await client.GetAsync(website, ct);
using (var reader = new StreamReader(await stream.Content.ReadAsStreamAsync(), Encoding.GetEncoding("windows-1256")))
data = reader.ReadToEnd();
//Parse data here and return Student.
} catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
而且它工作正常。有时虽然我需要为很多学生运行此功能,所以我使用以下
for(int i = ids.first; i <= ids.last; i++)
{
tasks[i - ids.first] = ParseStudentData.ParseAsync(entity.Link, i, cts.Token).ContinueWith(t =>
{
Dispatcher.Invoke(() =>
{
listview_students.Items.Add(t.Result);
//Students.Add(t.Result);
//lbl_count.Content = $"{listview_students.Items.Count}/{testerino.Length}";
});
});
}
我将任务存储在一个数组中,以便稍后等待。
只要学生人数在(0,~600?)之间,这也可以很好地工作,这有点随机。 然后对于尚未解析的所有其他学生抛出任务被取消。
请记住,我从不使用取消令牌。
我需要在这么多学生身上运行这个功能,它总共可以达到大约 9000 个异步任务。那么发生了什么?
【问题讨论】:
标签: c# parsing asynchronous task httpclient