JobHandle.WaitAsync accepts CancellationToken

master
neuecc 2020-05-25 09:58:06 +09:00
parent 7cce0f48e5
commit 8b7f832c0f
2 changed files with 17 additions and 9 deletions

View File

@ -9,10 +9,11 @@ namespace Cysharp.Threading.Tasks
{
public static partial class UnityAsyncExtensions
{
public static async UniTask WaitAsync(this JobHandle jobHandle, PlayerLoopTiming waitTiming)
public static async UniTask WaitAsync(this JobHandle jobHandle, PlayerLoopTiming waitTiming, CancellationToken cancellationToken = default)
{
await UniTask.Yield(waitTiming);
jobHandle.Complete();
cancellationToken.ThrowIfCancellationRequested(); // call cancel after Complete.
}
public static UniTask.Awaiter GetAwaiter(this JobHandle jobHandle)
@ -28,7 +29,9 @@ namespace Cysharp.Threading.Tasks
return new UniTask(handler, token).GetAwaiter();
}
// can not pass CancellationToken because can't handle JobHandle's Complete and NativeArray.Dispose.
public static UniTask ToUniTask(this JobHandle jobHandle, PlayerLoopTiming waitTiming)
{
var handler = JobHandlePromise.Create(jobHandle, out var token);

View File

@ -193,15 +193,20 @@ public class SandboxMain : MonoBehaviour
async UniTask RunJobAsync()
{
var job = new MyJob() { loopCount = 999, inOut = new NativeArray<int>(1, Allocator.TempJob) };
JobHandle.ScheduleBatchedJobs();
try
{
JobHandle.ScheduleBatchedJobs();
var scheduled = job.Schedule();
var scheduled = job.Schedule();
UnityEngine.Debug.Log("OK");
await scheduled; // .ConfigureAwait(PlayerLoopTiming.Update); // .WaitAsync(PlayerLoopTiming.Update);
UnityEngine.Debug.Log("OK2");
job.inOut.Dispose();
UnityEngine.Debug.Log("OK");
await scheduled; // .ConfigureAwait(PlayerLoopTiming.Update); // .WaitAsync(PlayerLoopTiming.Update);
UnityEngine.Debug.Log("OK2");
}
finally
{
job.inOut.Dispose();
}
}