我有一個 linq 運算式可以完成這項作業:
var y = docs.ToList()
var res = y.Select(async b => await loadAgence(b.url))
.Select(x => x.Result)
:
:
private async Task<BsonDocument? doc, int status, bool iSSucess) loadAgence(string url)
{
var (docs, status, isSuccess) = await Helper.API_GetDocument(url);
return (isSuccess ? docs : null, status, isSuccess)
}
這項作業需要 3 分鐘來執行 900 個回圈(900 呼叫 API)
我會將收藏分成 3 部分,將時間間隔除以 3
var res1 = y.Skip(0).Take(300).Select(async b => await loadAgence(b.url))
.Select(x => x.Result)
var res2 = y.Skip(300).Take(300)Select(async b => await loadAgence(b.url))
.Select(x => x.Result)
var res3 = y.Skip(600).Take(300)Select(async b => await loadAgence(b.url))
.Select(x => x.Result)
但是當然每個部分都被阻止了,我該如何解決這個問題?
我曾嘗試WhenAll與串列集合(res1 到 res3)一起使用,但它正在等待IEnumerable<Task> ,我有List<IEnumerable<Task<BsonDocument? doc, int status, bool iSuccess)>>> 所以它拒絕演員表..
可以這樣做嗎?
uj5u.com熱心網友回復:
但是當然每個部分都被阻止了,我該如何解決這個問題?
因為您使用串列.Select(x => x.Result)的每個部分,Task這意味著代碼將等待每個連接,就像同步代碼一樣。
如果你想使用異步代碼,我們可能會得到Task或Task這個例子中的 List,我們IEnumerable<Task(BsonDocument? doc, int status, bool iSSucess)>>將從res1, res2,res3
var res1 = y.Skip(0).Take(300).Select(async b => await loadAgence(b.url));
var res2 = y.Skip(300).Take(300).Select(async b => await loadAgence(b.url));
var res3 = y.Skip(600).Take(300).Select(async b => await loadAgence(b.url));
不幸的是Task.WhenAll可能不支持多個IEnumerable<Task>陣列引數,所以我們可以嘗試使用List<Task<(BsonDocument? doc, int status, bool iSSucess)>>追加所有串列然后Task.WhenAll
var tasks = new List<Task<(BsonDocument? doc, int status, bool iSSucess)>>();
tasks.AddRange(res1);
tasks.AddRange(res2);
tasks.AddRange(res3);
var result = await Task.WhenAll(tasks.ToArray());
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/465770.html
