Получение нулевого результата в результате использования задач - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь вызвать асин c функцию в l oop для порождения объекта. это не работает, как я ожидал. Словарь дает ошибки при добавлении одного и того же элемента несколько раз. Я не могу сделать всю функцию асин c. Вот код:

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 (), чтобы дождаться завершения потока до sh и затем вернуться из функции, но это также выдает ошибки.

Вопрос: - Как я могу создать экземпляр каждого объекта асинхронно перед выходом из l oop?

1 Ответ

1 голос
/ 21 февраля 2020

Вы можете просмотреть документацию для async / await для c#: 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();

Это не потребует изменений функции и т. Д. c ...

Надеюсь, это поможет

...