using System;
using System.Collections;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
namespace UniGLTF
{
///
/// work around
///
/// https://forum.unity.com/threads/async-await-in-editor-script.481276/
///
/// https://github.com/Unity-Technologies/UnityCsReference/blob/master/Runtime/Export/Scripting/UnitySynchronizationContext.cs
///
///
///
///
public static class TaskExtensions
{
delegate void ExecFunc();
static ExecFunc s_exec;
static void Invoke()
{
if (s_exec == null)
{
var context = SynchronizationContext.Current;
var t = context.GetType();
var execMethod = t.GetMethod("Exec", BindingFlags.NonPublic | BindingFlags.Instance);
var exec = execMethod.CreateDelegate(typeof(ExecFunc), context);
s_exec = (ExecFunc)exec;
}
s_exec();
}
public static IEnumerable AsIEnumerator(this Task task)
{
while (!task.IsCompleted)
{
yield return null;
#if UNITY_EDITOR
if (!UnityEngine.Application.isPlaying)
{
Invoke();
}
#endif
}
if (task.IsFaulted)
{
throw task.Exception;
}
}
}
}