Я получил следующее решение. Я не нашел способа загрузить основной поток необработанных файлов, но мне удалось загрузить его в Coroutine и выполнить дальнейшие (также тяжелые) операции с этим файлом в фоновом потоке. Я сделал статический метод, подобный этому:
public static void ReadAllBytesInCoroutine(MonoBehaviour context, string filePath, Action<ReadBytesInCoroutineResult> onComplete)
{
context.StartCoroutine(ReadFileBytesAndTakeAction(filePath, onComplete));
}
private static IEnumerator ReadFileBytesAndTakeAction(string filePath, Action<ReadBytesInCoroutineResult> followingAction)
{
WWW reader = null;
try
{
reader = new WWW(filePath);
}
catch(Exception exception)
{
followingAction.Invoke(ReadBytesInCoroutineResult.Failure(exception));
}
while (reader != null && !reader.isDone)
{
yield return null;
}
followingAction.Invoke(ReadBytesInCoroutineResult.Success(reader.bytes));
}
ReadBytesInCoroutineResult - это мой простой, настраиваемый класс данных:
public class ReadBytesInCoroutineResult
{
public readonly bool successful;
public readonly byte[] data;
public readonly Exception reason;
private ReadBytesInCoroutineResult(bool successful, byte[] data, Exception reason)
{
this.successful = successful;
this.data = data;
this.reason = reason;
}
public static ReadBytesInCoroutineResult Success(byte[] data)
{
return new ReadBytesInCoroutineResult(true, data, null);
}
public static ReadBytesInCoroutineResult Failure(Exception reason)
{
return new ReadBytesInCoroutineResult(true, null, reason);
}
}
Таким образом, у меня есть механизм заказа загрузки файла в сопрограмме в любое место (пока оно находится в главном потоке). Файл загружается синхронно, но он не блокирует основной поток из-за сопрограммы. Позже я вызываю эту функцию и беру полученные байты в отдельный поток, где я выполняю тяжелые вычисления на них.
ResourcesUtils.ReadAllBytesInCoroutine(monoBehavior, filePath, (bytes) => {
//here I run an async method which takes bytes as parameter
});
Это было бы соответствующим использованием механизма сессии, пока Вы имеете это в виду:
Хороший шаблон использования был бы похож на это (cookie эфира или сессия):
Вещи не сделать в cookie
Я уверен, что существуют другие вещи рассмотреть также, но это просто первое, что пришло на ум здесь.
Это могло работать хорошо на относительно небольшие объемы данных, но необходимо будет некоторые принять вещи во внимание:
Если Вы только хотите это доступные данные во время их сессии, то да. Если Вы хотите это доступный завтра, или 4 часа с этого времени, необходимо сохранить его к базе данных.
Технически можно изменить сессии, чтобы иметь очень длинную продолжительность жизни, но понять, используют ли они другой компьютер, другой браузер или сбрасывают их cookie, они освободят ссылку на свою сессию, поэтому что-либо серьезное, необходимо создать тип учетной записи пользователя в приложении, связать сессию с их учетной записью и сохранить данные в проникать месте.