如何一次 运行 多项任务并将 return 值添加到列表中?
How to run mutliple tasks at once and add return values to a list?
一次 运行 多个 tasks 并将它们的 return 值添加到 c sharp 列表中的最简单方法是什么?
我尝试了几种方法,但我可能做错了所有事情,因此我在这里没有太多代码 post。
更新:
这是我失败的尝试之一。我基本上是想从 link 中获取 JSON 字典(每个任务的 links 都会不同)并将所有 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;
}
}
这种方法的问题是没有任何东西被添加到列表中。实际上也没有与 link 建立联系。但是当正常完成时,数据是存在的。
最简单的方法可能是使用Select
LINQ operator, combined with the Task.WhenAll
方法:
int[] ids = GetIds();
Task<Image>[] tasks = ids.Select(id => DownloadImageAsync(id)).ToArray();
Image[] results = await Task.WhenAll(tasks);
在此示例中,Select
运算符将每个 int
投影到 Task<Image>
,从而产生 IEnumerable<Image>
序列。使用 ToArray
LINQ 运算符将此序列具体化为 Task<Image>
的数组。
如果您为每个图像调用的方法不是异步的,那么您可以这样代替 .Select(id => DownloadImageAsync(id))
:
.Select(id => Task.Run(() => DownloadImage(id)))
。这样,将使用 ThreadPool
个线程并行调用多个 DownloadImage
。池中的线程数量是有限的,因此您很可能无法获得与真正的异步 DownloadImageAsync
调用相同程度的并行性。
一次 运行 多个 tasks 并将它们的 return 值添加到 c sharp 列表中的最简单方法是什么? 我尝试了几种方法,但我可能做错了所有事情,因此我在这里没有太多代码 post。
更新:
这是我失败的尝试之一。我基本上是想从 link 中获取 JSON 字典(每个任务的 links 都会不同)并将所有 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;
}
}
这种方法的问题是没有任何东西被添加到列表中。实际上也没有与 link 建立联系。但是当正常完成时,数据是存在的。
最简单的方法可能是使用Select
LINQ operator, combined with the Task.WhenAll
方法:
int[] ids = GetIds();
Task<Image>[] tasks = ids.Select(id => DownloadImageAsync(id)).ToArray();
Image[] results = await Task.WhenAll(tasks);
在此示例中,Select
运算符将每个 int
投影到 Task<Image>
,从而产生 IEnumerable<Image>
序列。使用 ToArray
LINQ 运算符将此序列具体化为 Task<Image>
的数组。
如果您为每个图像调用的方法不是异步的,那么您可以这样代替 .Select(id => DownloadImageAsync(id))
:
.Select(id => Task.Run(() => DownloadImage(id)))
。这样,将使用 ThreadPool
个线程并行调用多个 DownloadImage
。池中的线程数量是有限的,因此您很可能无法获得与真正的异步 DownloadImageAsync
调用相同程度的并行性。