Как использовать async/await?
Добавлено: 28 май 2020, 15:31
Простите за тупость, но я не могу найти понятных примеров для "чайников". Например, мне нужно создать 10000 объектов асинхронно. Как это сделать? Из этой инструкции я понял, что куда-то надо впихнуть метод расширения GetAwaiter, который возвращает объект Awaiter, но вопрос- куда? Я расстроен необходимостью вставлять какие-то вызовы, изначально я думал, что можно вообще любой код заставить работать асинхронно, тупо подставив async вместо void, но по ходу я жестоко ошибался. Можете на пальцах объяснить?
Изначально хотел потоки изучить, но так такая жесть, нельзя использовать api Unity вне главного потока! У меня нет тяжелых вычислений, которые можно было бы изолировать вне основного потока. Самое тяжелое связано с getPosition/setPosition, setActive и пр- как раз то, что не работает из сторонних потоков. Я подумал, ну их на фиг, эту мультипоточность, буду асинхронные штуки изучать. В await'ах вызовы Unity api вроде должны работать.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading.Tasks;
public class AsyncAwaitTask : MonoBehaviour
{
public GameObject go;
public List<GameObject> gos = new List<GameObject>();
async void Update()
{
await AsyncMethod();
}
int cycles = 10000;
async Task AsyncMethod()
{
for (int i = 0; i < cycles; i++)
{
Vector3 pos = new Vector3(Random.Range(0, 100), 2f, Random.Range(0, 100));
GameObject obj = Instantiate(go, pos, Quaternion.identity);
gos.Add(obj);
}
}
}
using System.Collections.Generic;
using UnityEngine;
using System.Threading.Tasks;
public class AsyncAwaitTask : MonoBehaviour
{
public GameObject go;
public List<GameObject> gos = new List<GameObject>();
async void Update()
{
await AsyncMethod();
}
int cycles = 10000;
async Task AsyncMethod()
{
for (int i = 0; i < cycles; i++)
{
Vector3 pos = new Vector3(Random.Range(0, 100), 2f, Random.Range(0, 100));
GameObject obj = Instantiate(go, pos, Quaternion.identity);
gos.Add(obj);
}
}
}
Изначально хотел потоки изучить, но так такая жесть, нельзя использовать api Unity вне главного потока! У меня нет тяжелых вычислений, которые можно было бы изолировать вне основного потока. Самое тяжелое связано с getPosition/setPosition, setActive и пр- как раз то, что не работает из сторонних потоков. Я подумал, ну их на фиг, эту мультипоточность, буду асинхронные штуки изучать. В await'ах вызовы Unity api вроде должны работать.