我需要編寫一個方法,可以異步加載和解析多個網站。 這是我的方法的簡化代碼。RanToCompletion仍然在等待時
using (HTMLParser parser = new HTMLParser(proxy))
{
var tasks = totalSites.Select(s =>
{
return new Task(async() =>
{
s.Entity = await parser.GetSiteDataAsync(s.Entity).ConfigureAwait(false);
});
}).ToArray();
foreach (var task in tasks)
task.Start();
await Task.WhenAll(tasks).ConfigureAwait(false);
}
HTMLParser
類使用HttpClient
加載網站並配置它脫手。完整的代碼也使用CancellationToken
來取消,並使用SemaphoreSlim
來降低並行度。
問題是,當任務開始等待分析數據時,它的狀態設置爲RanToCompletion
。然後程序通過Task.WhenAll
並配置HTMLParser
導致OperationCanceledException
在HttpClient
中。
如果你的代碼將被I/O綁定,你的方法通常不應該明確地創建新的Task對象。我認爲你現在的代碼最後是'Task's包裝其他'Task's,這不是盛大的。 –
@GWigWam,對不起,我錯過了簡化我的代碼。 's'用於創建'vm'。 @Damien_The_Unbeliever我認爲你是對的:我需要創建多個任務來加載它並行的多個網站。 –
@AndreyAlonzov - 但是對於I/O綁定的工作,你*不應該創建任務 - 你應該利用'async'和'await',但是唯一的你應該處理的任務是通過'async'方法返回的*。 –