ToCancellationToken(linkeToken)
parent
3ed6e28a00
commit
c06e45d0bb
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue