mirror of https://github.com/Cysharp/UniTask
test all passed
parent
eb379903b8
commit
a26a806b0f
|
@ -6,10 +6,29 @@ using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using UniRx.Async;
|
using UniRx.Async;
|
||||||
|
using Unity.Collections;
|
||||||
|
using Unity.Jobs;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Networking;
|
using UnityEngine.Networking;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
public struct MyJob : IJob
|
||||||
|
{
|
||||||
|
public int loopCount;
|
||||||
|
public NativeArray<int> inOut;
|
||||||
|
public int result;
|
||||||
|
|
||||||
|
public void Execute()
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
for (int i = 0; i < loopCount; i++)
|
||||||
|
{
|
||||||
|
result++;
|
||||||
|
}
|
||||||
|
inOut[0] = result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class SandboxMain : MonoBehaviour
|
public class SandboxMain : MonoBehaviour
|
||||||
{
|
{
|
||||||
public Button okButton;
|
public Button okButton;
|
||||||
|
@ -20,11 +39,45 @@ public class SandboxMain : MonoBehaviour
|
||||||
|
|
||||||
UniTaskCompletionSource ucs;
|
UniTaskCompletionSource ucs;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async UniTask RunStandardDelayAsync()
|
||||||
|
{
|
||||||
|
UnityEngine.Debug.Log("DEB");
|
||||||
|
|
||||||
|
await UniTask.DelayFrame(30);
|
||||||
|
|
||||||
|
UnityEngine.Debug.Log("DEB END");
|
||||||
|
}
|
||||||
|
|
||||||
|
async UniTask RunJobAsync()
|
||||||
|
{
|
||||||
|
var job = new MyJob() { loopCount = 999, inOut = new NativeArray<int>(1, Allocator.TempJob) };
|
||||||
|
JobHandle.ScheduleBatchedJobs();
|
||||||
|
|
||||||
|
var scheduled = job.Schedule();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
UnityEngine.Debug.Log("OK");
|
||||||
|
await scheduled; // .ConfigureAwait(PlayerLoopTiming.Update); // .WaitAsync(PlayerLoopTiming.Update);
|
||||||
|
UnityEngine.Debug.Log("OK2");
|
||||||
|
|
||||||
|
job.inOut.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
void Start()
|
void Start()
|
||||||
{
|
{
|
||||||
|
Application.SetStackTraceLogType(LogType.Error, StackTraceLogType.Full);
|
||||||
|
Application.SetStackTraceLogType(LogType.Exception, StackTraceLogType.Full);
|
||||||
|
|
||||||
var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetCurrentPlayerLoop();
|
var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetCurrentPlayerLoop();
|
||||||
ShowPlayerLoop.DumpPlayerLoop("Current", playerLoop);
|
ShowPlayerLoop.DumpPlayerLoop("Current", playerLoop);
|
||||||
|
|
||||||
|
|
||||||
|
RunStandardDelayAsync().Forget();
|
||||||
|
|
||||||
//for (int i = 0; i < 14; i++)
|
//for (int i = 0; i < 14; i++)
|
||||||
//{
|
//{
|
||||||
// TimingDump((PlayerLoopTiming)i).Forget();
|
// TimingDump((PlayerLoopTiming)i).Forget();
|
||||||
|
@ -36,6 +89,19 @@ public class SandboxMain : MonoBehaviour
|
||||||
|
|
||||||
// -----
|
// -----
|
||||||
|
|
||||||
|
RunJobAsync().Forget();
|
||||||
|
|
||||||
|
//var cor = UniTask.ToCoroutine(async () =>
|
||||||
|
// {
|
||||||
|
// var job = new MyJob() { loopCount = 999, inOut = new NativeArray<int>(1, Allocator.TempJob) };
|
||||||
|
// JobHandle.ScheduleBatchedJobs();
|
||||||
|
// await job.Schedule().WaitAsync(PlayerLoopTiming.Update);
|
||||||
|
// job.inOut.Dispose();
|
||||||
|
// });
|
||||||
|
|
||||||
|
//StartCoroutine(cor);
|
||||||
|
|
||||||
|
|
||||||
Application.logMessageReceived += Application_logMessageReceived;
|
Application.logMessageReceived += Application_logMessageReceived;
|
||||||
|
|
||||||
|
|
||||||
|
@ -56,6 +122,22 @@ public class SandboxMain : MonoBehaviour
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async UniTask SimpleAwait()
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
await UniTask.Yield();
|
||||||
|
await UniTask.Yield();
|
||||||
|
throw new InvalidOperationException("bar!!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator SimpleCoroutine()
|
||||||
|
{
|
||||||
|
yield return null;
|
||||||
|
yield return null;
|
||||||
|
yield return null;
|
||||||
|
throw new InvalidOperationException("foo!!!");
|
||||||
|
}
|
||||||
|
|
||||||
async UniTask TimingDump(PlayerLoopTiming timing)
|
async UniTask TimingDump(PlayerLoopTiming timing)
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
|
|
|
@ -9,42 +9,45 @@ namespace UniRx.Async
|
||||||
{
|
{
|
||||||
public static partial class UnityAsyncExtensions
|
public static partial class UnityAsyncExtensions
|
||||||
{
|
{
|
||||||
|
public static async UniTask WaitAsync(this JobHandle jobHandle, PlayerLoopTiming waitTiming)
|
||||||
|
{
|
||||||
|
await UniTask.Yield(waitTiming);
|
||||||
|
jobHandle.Complete();
|
||||||
|
}
|
||||||
|
|
||||||
public static UniTask.Awaiter GetAwaiter(this JobHandle jobHandle)
|
public static UniTask.Awaiter GetAwaiter(this JobHandle jobHandle)
|
||||||
{
|
{
|
||||||
var handler = JobHandlePromise.Create(jobHandle, CancellationToken.None, out var token);
|
var handler = JobHandlePromise.Create(jobHandle, out var token);
|
||||||
if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem)
|
|
||||||
{
|
{
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, loopItem);
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, handler);
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, loopItem);
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, handler);
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, loopItem);
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, handler);
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, loopItem);
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, handler);
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, loopItem);
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new UniTask(handler, token).GetAwaiter();
|
return new UniTask(handler, token).GetAwaiter();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask ToUniTask(this JobHandle jobHandle, CancellationToken cancellation = default(CancellationToken))
|
public static UniTask ToUniTask(this JobHandle jobHandle)
|
||||||
{
|
{
|
||||||
var handler = JobHandlePromise.Create(jobHandle, cancellation, out var token);
|
var handler = JobHandlePromise.Create(jobHandle, out var token);
|
||||||
if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem)
|
|
||||||
{
|
{
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, loopItem);
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, handler);
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, loopItem);
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, handler);
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, loopItem);
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, handler);
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, loopItem);
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, handler);
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, loopItem);
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new UniTask(handler, token);
|
return new UniTask(handler, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask ConfigureAwait(this JobHandle jobHandle, PlayerLoopTiming waitTiming, CancellationToken cancellation = default(CancellationToken))
|
public static UniTask ConfigureAwait(this JobHandle jobHandle, PlayerLoopTiming waitTiming)
|
||||||
{
|
{
|
||||||
var handler = JobHandlePromise.Create(jobHandle, cancellation, out var token);
|
var handler = JobHandlePromise.Create(jobHandle, out var token);
|
||||||
if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem)
|
|
||||||
{
|
{
|
||||||
PlayerLoopHelper.AddAction(waitTiming, loopItem);
|
PlayerLoopHelper.AddAction(waitTiming, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new UniTask(handler, token);
|
return new UniTask(handler, token);
|
||||||
|
@ -53,22 +56,16 @@ namespace UniRx.Async
|
||||||
sealed class JobHandlePromise : IUniTaskSource, IPlayerLoopItem
|
sealed class JobHandlePromise : IUniTaskSource, IPlayerLoopItem
|
||||||
{
|
{
|
||||||
JobHandle jobHandle;
|
JobHandle jobHandle;
|
||||||
CancellationToken cancellationToken;
|
|
||||||
|
|
||||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||||
|
|
||||||
public static IUniTaskSource Create(JobHandle jobHandle, CancellationToken cancellationToken, out short token)
|
// Cancellation is not supported.
|
||||||
|
public static JobHandlePromise Create(JobHandle jobHandle, out short token)
|
||||||
{
|
{
|
||||||
if (cancellationToken.IsCancellationRequested)
|
|
||||||
{
|
|
||||||
return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);
|
|
||||||
}
|
|
||||||
|
|
||||||
// not use pool.
|
// not use pool.
|
||||||
var result = new JobHandlePromise();
|
var result = new JobHandlePromise();
|
||||||
|
|
||||||
result.jobHandle = jobHandle;
|
result.jobHandle = jobHandle;
|
||||||
result.cancellationToken = cancellationToken;
|
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(result, 3);
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
|
@ -99,12 +96,6 @@ namespace UniRx.Async
|
||||||
|
|
||||||
public bool MoveNext()
|
public bool MoveNext()
|
||||||
{
|
{
|
||||||
if (cancellationToken.IsCancellationRequested)
|
|
||||||
{
|
|
||||||
core.TrySetCanceled(cancellationToken);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (jobHandle.IsCompleted)
|
if (jobHandle.IsCompleted)
|
||||||
{
|
{
|
||||||
jobHandle.Complete();
|
jobHandle.Complete();
|
||||||
|
|
Loading…
Reference in New Issue