【发布时间】:2020-02-21 09:22:21
【问题描述】:
我正在尝试在循环中调用异步函数来生成对象。它不像我预期的那样工作。字典给出了关于多次添加相同项目的错误。我不能使整个函数异步。代码如下:
public Dictionary_String_Prop GeneratePlaceables(List<PropData> props, Prop parent = null)
{
Dictionary_String_Prop temp = new Dictionary_String_Prop ();
if(props == null)
{
Debugger.Log("PropdataList Empty: Returning Empty Dictionary");
return temp;
}
for (int i = 0; i < props.Count; i++)
{
var result = GameModeGame.Get().placeableDB[props[i].dataID].Prefab;
PropData propData = props[i];
result.InstantiateAsync(props[i].sTransform.Position(), props[i].sTransform.Rotation()).Completed += a =>
{
Placeable p = a.Result.GetComponent<Placeable>();
p.uniqueID = propData.uniqueID;
p.State = propData.state;
p.InitData();
if(parent)
p.SetParent(parent);
else
p.transform.SetParent(manager.transform);
p.transform.localScale = propData.sTransform.Scale();
p.children = GeneratePlaceables(propData.placeables, p);
temp.DebugLog();
temp.Add(p.uniqueID, p);
manager.allProps.Add(p.uniqueID, p);
};
}
return temp;
}
我还尝试将所有实例化任务保存到一个数组中,然后使用 Task.WaitAll() 等待线程完成然后从函数返回,但它也会抛出错误。
问题:- 如何在退出循环之前异步实例化每个对象?
【问题讨论】:
-
Dictionary_String_Prop是什么?它是一个线程安全的字典吗? (如ConcurrentDictionary)。InstantiateAsync的原型是什么? -
这是一个序列化的字典。我不确定线程安全。也许我应该用普通字典测试。
-
如果
InstantiateAsync真的是异步的,那么您不会在函数存在之前等待这些任务完成。整个函数真的需要异步吗? -
它来自 Unity 的 API。
public static AsyncOperationHandle<GameObject> InstantiateAsync(object key, Transform parent = null, bool instantiateInWorldSpace = false, bool trackHandle = true)这是我从那里复制的整个语法。这是页面的link。
标签: c# unity3d async-await task