【发布时间】:2016-05-22 11:55:19
【问题描述】:
我的要求很奇怪。
我有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+1) 之前,无需等待GetDataFor(i) 完成。
换句话说,我需要:
- 在成功调用
i后立即为每个i+1调用GetDataFor()(并行调用它们看起来不可能) - 等到所有
GetDataFor()的 100 个实例完成运行 - 离开
SomeMethod()的范围
按照YK1's answer,我尝试过这样修改:
public async Task<void> SomeMethod()
{
for(int i = 0; i < 100; i++) {
var task = Task.Run(() => GetDataFor(i));
var data = await task;
}
}
它没有抛出任何错误,但我需要了解这背后的概念:
-
task将如何区分对awaiting 的不同调用?它正在被覆盖。 - 这样做是不是公然错误的方法?那么,如何做到正确呢?
【问题讨论】:
-
您的代码不会并行运行它们。他们一个接一个地运行,因为你一直在等待完成。
-
@poke 明白了。我也不确定。我们如何纠正这个问题?
-
GetDataFor的主要组成部分是什么?是否受 CPU 限制?磁盘绑定?网络绑定?根据答案,您可能无论如何都不想并行运行它们。 -
呃,
Parallel.For?或 PLinqEnumerable.Range(0, 100).AsParallel().Select(i => GetDataFor(i));?
标签: c# performance asynchronous async-await task