一次運行多個任務并將它們的回傳值添加到 c 中的串列的最簡單方法是什么?我嘗試了幾種方法,但我可能做錯了所有事情,因此我沒有太多代碼可以在這里發布。
更新:
這是我的失敗嘗試之一。我基本上是想從鏈接中獲取 Json 字典(每個任務的鏈接都不同),并在最后將所有 json 字典添加到一個串列中。但我希望所有任務同時運行。
static class Program{
static void Main()
{
List<dynamic> writeList = new List<dynamic>();
for (int i = 0; i <= 50; i )
{
Task<dynamic> task = Task<dynamic>.Factory.StartNew(() => savePageData("www.someJsonlink.com"));
writeList.Add(task);
}
}
static dynamic savePageData(string url)
{
WebClient client = new WebClient();
string page = client.DownloadString(url);
var data = JsonConvert.DeserializeObject(page);
return data;
}
這種方法的問題是沒有任何內容添加到串列中。實際上也沒有與鏈接建立連接。但是當正常完成時,資料是存在的
uj5u.com熱心網友回復:
最簡單的方法大概是使用SelectLINQ運算子,結合Task.WhenAll方法:
int[] ids = GetIds();
Task<Image>[] tasks = ids.Select(id => DownloadImageAsync(id)).ToArray();
Image[] results = await Task.WhenAll(tasks);
在此示例中,Select運算子將每個投影int到 a Task<Image>,從而產生一個IEnumerable<Image>序列。此序列Task<Image>通過使用ToArrayLINQ 運算子具體化為一個陣列。
如果你正在呼吁每個影像的方法是不同步的,那么不是.Select(id => DownloadImageAsync(id))你可以這樣做:
.Select(id => Task.Run(() => DownloadImage(id)))。這樣,multipleDownloadImage將使用ThreadPool執行緒并行呼叫。池中的執行緒數是有限的,因此很可能無法獲得與真正異步DownloadImageAsync呼叫獲得的并行度相同的并行度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/367782.html
上一篇:在C#中,當我將該物件用作引數時,如何在該物件上執行該方法?
下一篇:自參考型別中的空物件模式
