【发布时间】:2014-11-29 23:11:48
【问题描述】:
我有以下代码用于从 REST 服务(Get(i) 调用)中获取数据,然后用它们的关系填充一个矩阵(未显示;这发生在 addLabels() 中)。
所有Get() 调用都可以彼此并行运行,但它们都必须在任何内容进入第二个循环之前完成(再次,调用可以彼此并行运行)。 addLabel() 调用依赖于 Get() 调用中的工作才能完成。
** 对于任何偶然发现这篇文章的人,这段代码就是解决方案:**
private async void GetTypeButton_Click(object sender, RoutedEventArgs e)
{
await PokeType.InitTypes(); // initializes relationships in the matrix
var table = PokeType.EffectivenessMatrix;
// pretty-printing the table
// ...
// ...
}
private static bool initialized = false;
public static async Task InitTypes()
{
if (initialized) return;
// await blocks until first batch is finished
await Task.WhenAll(Enumerable.Range(1, NUM_TYPES /* inclusive */).Select(i => Get(i)));
// doesn't need to be parallelized because it's quick work.
foreach(PokeType type in cachedTypes.Values)
{
JObject data = type.GetJsonFromCache();
addLabels(type, (JArray)data["super_effective"], Effectiveness.SuperEffectiveAgainst);
addLabels(type, (JArray)data["ineffective"], Effectiveness.NotVeryEffectiveAgainst);
addLabels(type, (JArray)data["no_effect"], Effectiveness.UselessAgainst);
}
initialized = true;
}
public static async Task<PokeType> Get(int id);
由于当前编写的代码,InitTypes() 方法尝试同时进入两个循环; cachedTypes 字典是空的,因为第一个循环还没有完成填充它,所以它永远不会运行,也没有构造任何关系。
我怎样才能正确地构造这个函数?谢谢!
【问题讨论】:
-
您不应该用答案更新您的问题,而是发布问题并创建一个 编辑 标题以指明解决方案,以便其他人可以看到问题所在是以及如何解决的。
标签: c# .net concurrency windows-runtime async-await