ToCancellationToken(linkeToken)

master
neuecc 2020-06-25 23:02:30 +09:00
parent 3ed6e28a00
commit c06e45d0bb
3 changed files with 43 additions and 7 deletions

View File

@ -18,11 +18,32 @@ namespace Cysharp.Threading.Tasks
return cts.Token; return cts.Token;
} }
public static CancellationToken ToCancellationToken<T>(this UniTask<T> task) public static CancellationToken ToCancellationToken(this UniTask task, CancellationToken linkToken)
{ {
if (linkToken.IsCancellationRequested)
{
return linkToken;
}
if (!linkToken.CanBeCanceled)
{
return ToCancellationToken(task);
}
var cts = new CancellationTokenSource(); var cts = new CancellationTokenSource();
ToCancellationTokenCore(task, cts).Forget(); ToCancellationTokenCore(task, cts).Forget();
return cts.Token;
return CancellationTokenSource.CreateLinkedTokenSource(linkToken).Token;
}
public static CancellationToken ToCancellationToken<T>(this UniTask<T> task)
{
return ToCancellationToken(task.AsUniTask());
}
public static CancellationToken ToCancellationToken<T>(this UniTask<T> task, CancellationToken linkToken)
{
return ToCancellationToken(task.AsUniTask(), linkToken);
} }
static async UniTaskVoid ToCancellationTokenCore(UniTask task, CancellationTokenSource cts) static async UniTaskVoid ToCancellationTokenCore(UniTask task, CancellationTokenSource cts)

View File

@ -437,13 +437,28 @@ public class SandboxMain : MonoBehaviour
void Start() async UniTaskVoid Start()
{ {
_ = Foo(); // unhandled. //_ = Foo(); // unhandled.
Go(); //Go();
var cts = new CancellationTokenSource();
okButton.onClick.AddListener(() =>
{
cts.Cancel();
});
UnityEngine.Debug.Log("Start:" + PlayerLoopInfo.CurrentLoopType); UnityEngine.Debug.Log("Start:" + PlayerLoopInfo.CurrentLoopType);
var token = UniTask.Delay(TimeSpan.FromSeconds(3), DelayType.Realtime).ToCancellationToken(cts.Token);
while (!token.IsCancellationRequested)
{
UnityEngine.Debug.Log("in loop");
await UniTask.Yield();
}
UnityEngine.Debug.Log("end");
// this.GetCancellationTokenOnDestroy() // this.GetCancellationTokenOnDestroy()

View File

@ -190,7 +190,7 @@ namespace Cysharp.Threading.TasksTests
{ {
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
await UniTask.DelayRealtime(TimeSpan.FromSeconds(2)); await UniTask.Delay(TimeSpan.FromSeconds(2), DelayType.Realtime);
var elapsed = DateTimeOffset.UtcNow - now; var elapsed = DateTimeOffset.UtcNow - now;