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.Tasks;
|
||||
using UniRx.Async;
|
||||
using Unity.Collections;
|
||||
using Unity.Jobs;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
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 Button okButton;
|
||||
|
@ -20,11 +39,45 @@ public class SandboxMain : MonoBehaviour
|
|||
|
||||
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()
|
||||
{
|
||||
Application.SetStackTraceLogType(LogType.Error, StackTraceLogType.Full);
|
||||
Application.SetStackTraceLogType(LogType.Exception, StackTraceLogType.Full);
|
||||
|
||||
var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetCurrentPlayerLoop();
|
||||
ShowPlayerLoop.DumpPlayerLoop("Current", playerLoop);
|
||||
|
||||
|
||||
RunStandardDelayAsync().Forget();
|
||||
|
||||
//for (int i = 0; i < 14; i++)
|
||||
//{
|
||||
// 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;
|
||||
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
while (true)
|
||||
|
|
|
@ -9,42 +9,45 @@ namespace UniRx.Async
|
|||
{
|
||||
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)
|
||||
{
|
||||
var handler = JobHandlePromise.Create(jobHandle, CancellationToken.None, out var token);
|
||||
if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem)
|
||||
var handler = JobHandlePromise.Create(jobHandle, out var token);
|
||||
{
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, loopItem);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, loopItem);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, loopItem);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, loopItem);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, loopItem);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, handler);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, handler);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, handler);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, handler);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, handler);
|
||||
}
|
||||
|
||||
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);
|
||||
if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem)
|
||||
var handler = JobHandlePromise.Create(jobHandle, out var token);
|
||||
{
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, loopItem);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, loopItem);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, loopItem);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, loopItem);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, loopItem);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, handler);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, handler);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, handler);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, handler);
|
||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, handler);
|
||||
}
|
||||
|
||||
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);
|
||||
if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem)
|
||||
var handler = JobHandlePromise.Create(jobHandle, out var token);
|
||||
{
|
||||
PlayerLoopHelper.AddAction(waitTiming, loopItem);
|
||||
PlayerLoopHelper.AddAction(waitTiming, handler);
|
||||
}
|
||||
|
||||
return new UniTask(handler, token);
|
||||
|
@ -53,22 +56,16 @@ namespace UniRx.Async
|
|||
sealed class JobHandlePromise : IUniTaskSource, IPlayerLoopItem
|
||||
{
|
||||
JobHandle jobHandle;
|
||||
CancellationToken cancellationToken;
|
||||
|
||||
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.
|
||||
var result = new JobHandlePromise();
|
||||
|
||||
result.jobHandle = jobHandle;
|
||||
result.cancellationToken = cancellationToken;
|
||||
|
||||
TaskTracker.TrackActiveTask(result, 3);
|
||||
|
||||
|
@ -99,12 +96,6 @@ namespace UniRx.Async
|
|||
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (jobHandle.IsCompleted)
|
||||
{
|
||||
jobHandle.Complete();
|
||||
|
|
Loading…
Reference in New Issue