我试图在循环中调用异步函数来生成对象。 它不像我预期的那样工作。 字典给出多次添加相同项目的错误。 我无法使整个函数异步。 这是代码:

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() 等待线程完成然后从函数返回,但它也会引发错误。

问题:-如何在退出循环之前异步实例化每个对象?

#1楼 票数:1 已采纳

您可能需要查看 c# 的 async/await 文档: https : //docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

每个async方法都需要在您的代码中匹配一个await ,您不需要等待任务的结果,所以....

result.InstantiateAsync(.....

需要等待:

await result.InstantiateAsync(.....

但这会产生您需要使函数async

public Dictionary_String_Prop GeneratePlaceables(List<PropData> props, Prop parent = null)

需要更改为:

public async Task<Dictionary_String_Prop> GeneratePlaceables(List<PropData> props, Prop parent = null)

任何调用GeneratePlaceables方法也需要await为什么一直使用 Async/await


如果你不能对你的函数进行更改,还有另一种方法可以让你同步等待结果:

Foo foo = GetFooAsync(...).GetAwaiter().GetResult();

所以:

result.InstantiateAsync(....).GetAwaiter().GetResult();

这不需要更改功能等...

希望这可以帮助

  ask by darpan1118 translate from so

未解决问题?本站智能推荐:

2回复

当SynchronizationContext.Current为null时,我可以安全地使用Task.Wait吗?

当SynchronizationContext.Current为null时,为什么不100%安全地调用Task.Wait()和Task.Result? 我有一个多线程但同步的服务。 我用对HttpClient.PostAsXmlAsync的调用替换了同步方法之一。 该实现使用.Resul
1回复

C#Tasks获取结果或捕获异常

我有: 我想这样做: 我该怎么做? 谢谢
1回复

为什么要使Tasks并行运行需要显式Task变量?

我正在尝试使用await使一些数据库数据检索任务并行运行。 由于某些原因,它仅在我显式创建Task变量的情况下有效,而在我直接等待返回那些Tasks的方法时则无效。 我在下面的控制台应用程序中有问题的示例: 我希望这两种方法都能产生完全相同的结果。
2回复

无法将类型'void'隐式转换为'System.Threading.Tasks.Task'

这是我的代码的简化版本,下面是生成以下编译错误 无法将类型'void'隐式转换为'System.Threading.Tasks.Task' 在这种情况下,GetDataAsync方法不需要返回任何内容。 如何让它返回我可以等待的任务?
1回复

不能隐式转换'System.Threading.Tasks.TaskTO'System.Collections.Generic.List<>

我将现有的一些方法设为异步,现在在我调用这些方法的属性中,我看到了错误: 不能隐式转换 'System.Threading.Tasks.Task<System.Collections.Generic.List<MyProj.BLL.Property>> 到 'System.
1回复

处理重载时使用等待?

我问自己以下两种解决方案哪个更好? 我对方法有一些重载,因为参数可能是可选的。 版本 1:返回任务并且不等待 版本 2:在每个方法中等待: 版本 2 在 IL 级别生成多个 (3) 状态机。 版本 1 只生成一个。 所以我认为从性能的角度来看,版本 1 更好,但可能有一些我没有想到的陷阱。 是否有一
1回复

使用Task.WhenAll时如何获得结果

假设我有一个添加帐户的Web服务。 我应该使用此服务来添加帐户列表: 为了测试目的,我试图模拟该服务的不稳定运行,尤其是在第一次尝试添加前三个帐户,而其他两个帐户进入第二轮的情况下。 在第二次尝试中,仅添加了“ 40704”帐户,“ 40705”帐户进入了第三轮,并在第三次尝试时添加了该
2回复

为什么在使用DapperQueryAsync时抛出TaskCanceledException没有异步/等待?

为什么在此方法上调用.Result导致TaskCanceledException: 但是调用.Result这个方法有效: 区别在于async\\await关键字正在第二种方法中使用。