我的要求很奇怪。
我有SomeMethod()
哪个电话GetDataFor()
。
public void SomeMethod()
{
for(int i = 0; i<100; i++) {
var data = GetDataFor(i);
}
}
public data GetDataFor(int i) {
//call a remote API
//to generate data for i
//store to database
return data;
}
对于每个i
,最终结果将始终是不同的。有没有需要等待的GetDataFor(i)
调用之前完成GetDataFor(i+1)
。
换句话说,我需要:
GetDataFor()
每个对象(并行调用它们看起来是不可能的)i+1
i
GetDataFor()
完成运行SomeMethod()
遵循YK1的答案,我试图像这样修改它:
public async Task<void> SomeMethod()
{
for(int i = 0; i < 100; i++) {
var task = Task.Run(() => GetDataFor(i));
var data = await task;
}
}
它没有引发任何错误,但是我需要了解其背后的概念:
task
区分不同的await
求助电话?它已被覆盖。您可以使用Parallel.For
:
public void SomeMethod()
{
Parallel.For(0, 100, i =>
{
var data = GetDataFor(i);
//Do something
});
}
public data GetDataFor(int i)
{
//generate data for i
return data;
}
编辑:
并行循环的语法for
与foreach
您已经知道的and循环非常相似,但是并行循环在具有可用核心的计算机上运行得更快。另一个区别是,与顺序循环不同,它没有为并行循环定义执行顺序。步骤通常是同时并行进行的。有时,与循环是顺序的相比,两个步骤的执行顺序相反。唯一的保证是,所有循环的迭代将在循环结束时运行。
对于并行循环,不需要由代码指定并行度。而是,运行时环境在尽可能多的内核上同时执行循环的步骤。无论有多少个内核可用,循环都能正常工作。如果只有一个内核,那么性能将接近等效的内核(也许在几个百分点之内)。如果有多个核心,性能会提高;在许多情况下,性能与内核数成比例地提高。
您可以在此处查看更详细的说明。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句