/
GeekNerd
/
ServerModelingProject
Обзор
Документация
Войти
/
GeekNerd
/
ServerModelingProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Plugins/UniTask/Runtime/UniTask.Factory.cs
701 строка
23 KB
Gorney-Alex
Init
30 май 2026, 19:05
30 май 2026, 19:05
3cdcc49
Код
Авторство
О чём код?
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using Cysharp.Threading.Tasks.Internal; using System; using System.Runtime.CompilerServices; using System.Runtime.ExceptionServices; using System.Threading; namespace Cysharp.Threading.Tasks { public partial struct UniTask { static readonly UniTask CanceledUniTask = new Func<UniTask>(() => { return new UniTask(new CanceledResultSource(CancellationToken.None), 0); })(); static class CanceledUniTaskCache<T> { public static readonly UniTask<T> Task; static CanceledUniTaskCache() { Task = new UniTask<T>(new CanceledResultSource<T>(CancellationToken.None), 0); } } public static readonly UniTask CompletedTask = new UniTask(); public static UniTask FromException(Exception ex) { if (ex is OperationCanceledException oce) { return FromCanceled(oce.CancellationToken); } return new UniTask(new ExceptionResultSource(ex), 0); } public static UniTask<T> FromException<T>(Exception ex) { if (ex is OperationCanceledException oce) { return FromCanceled<T>(oce.CancellationToken); } return new UniTask<T>(new ExceptionResultSource<T>(ex), 0); } public static UniTask<T> FromResult<T>(T value) { return new UniTask<T>(value); } public static UniTask FromCanceled(CancellationToken cancellationToken = default) { if (cancellationToken == CancellationToken.None) { return CanceledUniTask; } else { return new UniTask(new CanceledResultSource(cancellationToken), 0); } } public static UniTask<T> FromCanceled<T>(CancellationToken cancellationToken = default) { if (cancellationToken == CancellationToken.None) { return CanceledUniTaskCache<T>.Task; } else { return new UniTask<T>(new CanceledResultSource<T>(cancellationToken), 0); } } public static UniTask Create(Func<UniTask> factory) { return factory(); } public static UniTask Create(Func<CancellationToken, UniTask> factory, CancellationToken cancellationToken) { return factory(cancellationToken); } public static UniTask Create<T>(T state, Func<T, UniTask> factory) { return factory(state); } public static UniTask<T> Create<T>(Func<UniTask<T>> factory) { return factory(); } public static AsyncLazy Lazy(Func<UniTask> factory) { return new AsyncLazy(factory); } public static AsyncLazy<T> Lazy<T>(Func<UniTask<T>> factory) { return new AsyncLazy<T>(factory); } /// <summary> /// helper of fire and forget void action. /// </summary> public static void Void(Func<UniTaskVoid> asyncAction) { asyncAction().Forget(); } /// <summary> /// helper of fire and forget void action. /// </summary> public static void Void(Func<CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) { asyncAction(cancellationToken).Forget(); } /// <summary> /// helper of fire and forget void action. /// </summary> public static void Void<T>(Func<T, UniTaskVoid> asyncAction, T state) { asyncAction(state).Forget(); } /// <summary> /// helper of create add UniTaskVoid to delegate. /// For example: FooAction = UniTask.Action(async () => { /* */ }) /// </summary> public static Action Action(Func<UniTaskVoid> asyncAction) { return () => asyncAction().Forget(); } /// <summary> /// helper of create add UniTaskVoid to delegate. /// </summary> public static Action Action(Func<CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) { return () => asyncAction(cancellationToken).Forget(); } /// <summary> /// helper of create add UniTaskVoid to delegate. /// </summary> public static Action Action<T>(T state, Func<T, UniTaskVoid> asyncAction) { return () => asyncAction(state).Forget(); } #if UNITY_2018_3_OR_NEWER /// <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(async () => { /* */ } )) /// </summary> public static UnityEngine.Events.UnityAction UnityAction(Func<UniTaskVoid> asyncAction) { return () => asyncAction().Forget(); } /// <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(FooAsync, this.GetCancellationTokenOnDestroy())) /// </summary> public static UnityEngine.Events.UnityAction UnityAction(Func<CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) { return () => asyncAction(cancellationToken).Forget(); } /// <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(FooAsync, Argument)) /// </summary> public static UnityEngine.Events.UnityAction UnityAction<T>(T state, Func<T, UniTaskVoid> asyncAction) { return () => asyncAction(state).Forget(); } /// <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(async (T arg) => { /* */ } )) /// </summary> public static UnityEngine.Events.UnityAction<T> UnityAction<T>(Func<T, UniTaskVoid> asyncAction) { return (arg) => asyncAction(arg).Forget(); } /// <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1) => { /* */ } )) /// </summary> public static UnityEngine.Events.UnityAction<T0, T1> UnityAction<T0, T1>(Func<T0, T1, UniTaskVoid> asyncAction) { return (arg0, arg1) => asyncAction(arg0, arg1).Forget(); } /// <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2) => { /* */ } )) /// </summary> public static UnityEngine.Events.UnityAction<T0, T1, T2> UnityAction<T0, T1, T2>(Func<T0, T1, T2, UniTaskVoid> asyncAction) { return (arg0, arg1, arg2) => asyncAction(arg0, arg1, arg2).Forget(); } /// <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2, T3 arg3) => { /* */ } )) /// </summary> public static UnityEngine.Events.UnityAction<T0, T1, T2, T3> UnityAction<T0, T1, T2, T3>(Func<T0, T1, T2, T3, UniTaskVoid> asyncAction) { return (arg0, arg1, arg2, arg3) => asyncAction(arg0, arg1, arg2, arg3).Forget(); } // <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(async (T arg, CancellationToken cancellationToken) => { /* */ } )) /// </summary> public static UnityEngine.Events.UnityAction<T> UnityAction<T>(Func<T, CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) { return (arg) => asyncAction(arg, cancellationToken).Forget(); } /// <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, CancellationToken cancellationToken) => { /* */ } )) /// </summary> public static UnityEngine.Events.UnityAction<T0, T1> UnityAction<T0, T1>(Func<T0, T1, CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) { return (arg0, arg1) => asyncAction(arg0, arg1, cancellationToken).Forget(); } /// <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2, CancellationToken cancellationToken) => { /* */ } )) /// </summary> public static UnityEngine.Events.UnityAction<T0, T1, T2> UnityAction<T0, T1, T2>(Func<T0, T1, T2, CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) { return (arg0, arg1, arg2) => asyncAction(arg0, arg1, arg2, cancellationToken).Forget(); } /// <summary> /// Create async void(UniTaskVoid) UnityAction. /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2, T3 arg3, CancellationToken cancellationToken) => { /* */ } )) /// </summary> public static UnityEngine.Events.UnityAction<T0, T1, T2, T3> UnityAction<T0, T1, T2, T3>(Func<T0, T1, T2, T3, CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) { return (arg0, arg1, arg2, arg3) => asyncAction(arg0, arg1, arg2, arg3, cancellationToken).Forget(); } #endif /// <summary> /// Defer the task creation just before call await. /// </summary> public static UniTask Defer(Func<UniTask> factory) { return new UniTask(new DeferPromise(factory), 0); } /// <summary> /// Defer the task creation just before call await. /// </summary> public static UniTask<T> Defer<T>(Func<UniTask<T>> factory) { return new UniTask<T>(new DeferPromise<T>(factory), 0); } /// <summary> /// Defer the task creation just before call await. /// </summary> public static UniTask Defer<TState>(TState state, Func<TState, UniTask> factory) { return new UniTask(new DeferPromiseWithState<TState>(state, factory), 0); } /// <summary> /// Defer the task creation just before call await. /// </summary> public static UniTask<TResult> Defer<TState, TResult>(TState state, Func<TState, UniTask<TResult>> factory) { return new UniTask<TResult>(new DeferPromiseWithState<TState, TResult>(state, factory), 0); } /// <summary> /// Never complete. /// </summary> public static UniTask Never(CancellationToken cancellationToken) { return new UniTask<AsyncUnit>(new NeverPromise<AsyncUnit>(cancellationToken), 0); } /// <summary> /// Never complete. /// </summary> public static UniTask<T> Never<T>(CancellationToken cancellationToken) { return new UniTask<T>(new NeverPromise<T>(cancellationToken), 0); } sealed class ExceptionResultSource : IUniTaskSource { readonly ExceptionDispatchInfo exception; bool calledGet; public ExceptionResultSource(Exception exception) { this.exception = ExceptionDispatchInfo.Capture(exception); } public void GetResult(short token) { if (!calledGet) { calledGet = true; GC.SuppressFinalize(this); } exception.Throw(); } public UniTaskStatus GetStatus(short token) { return UniTaskStatus.Faulted; } public UniTaskStatus UnsafeGetStatus() { return UniTaskStatus.Faulted; } public void OnCompleted(Action<object> continuation, object state, short token) { continuation(state); } ~ExceptionResultSource() { if (!calledGet) { UniTaskScheduler.PublishUnobservedTaskException(exception.SourceException); } } } sealed class ExceptionResultSource<T> : IUniTaskSource<T> { readonly ExceptionDispatchInfo exception; bool calledGet; public ExceptionResultSource(Exception exception) { this.exception = ExceptionDispatchInfo.Capture(exception); } public T GetResult(short token) { if (!calledGet) { calledGet = true; GC.SuppressFinalize(this); } exception.Throw(); return default; } void IUniTaskSource.GetResult(short token) { if (!calledGet) { calledGet = true; GC.SuppressFinalize(this); } exception.Throw(); } public UniTaskStatus GetStatus(short token) { return UniTaskStatus.Faulted; } public UniTaskStatus UnsafeGetStatus() { return UniTaskStatus.Faulted; } public void OnCompleted(Action<object> continuation, object state, short token) { continuation(state); } ~ExceptionResultSource() { if (!calledGet) { UniTaskScheduler.PublishUnobservedTaskException(exception.SourceException); } } } sealed class CanceledResultSource : IUniTaskSource { readonly CancellationToken cancellationToken; public CanceledResultSource(CancellationToken cancellationToken) { this.cancellationToken = cancellationToken; } public void GetResult(short token) { throw new OperationCanceledException(cancellationToken); } public UniTaskStatus GetStatus(short token) { return UniTaskStatus.Canceled; } public UniTaskStatus UnsafeGetStatus() { return UniTaskStatus.Canceled; } public void OnCompleted(Action<object> continuation, object state, short token) { continuation(state); } } sealed class CanceledResultSource<T> : IUniTaskSource<T> { readonly CancellationToken cancellationToken; public CanceledResultSource(CancellationToken cancellationToken) { this.cancellationToken = cancellationToken; } public T GetResult(short token) { throw new OperationCanceledException(cancellationToken); } void IUniTaskSource.GetResult(short token) { throw new OperationCanceledException(cancellationToken); } public UniTaskStatus GetStatus(short token) { return UniTaskStatus.Canceled; } public UniTaskStatus UnsafeGetStatus() { return UniTaskStatus.Canceled; } public void OnCompleted(Action<object> continuation, object state, short token) { continuation(state); } } sealed class DeferPromise : IUniTaskSource { Func<UniTask> factory; UniTask task; UniTask.Awaiter awaiter; public DeferPromise(Func<UniTask> factory) { this.factory = factory; } public void GetResult(short token) { awaiter.GetResult(); } public UniTaskStatus GetStatus(short token) { var f = Interlocked.Exchange(ref factory, null); if (f != null) { task = f(); awaiter = task.GetAwaiter(); } return task.Status; } public void OnCompleted(Action<object> continuation, object state, short token) { awaiter.SourceOnCompleted(continuation, state); } public UniTaskStatus UnsafeGetStatus() { return task.Status; } } sealed class DeferPromise<T> : IUniTaskSource<T> { Func<UniTask<T>> factory; UniTask<T> task; UniTask<T>.Awaiter awaiter; public DeferPromise(Func<UniTask<T>> factory) { this.factory = factory; } public T GetResult(short token) { return awaiter.GetResult(); } void IUniTaskSource.GetResult(short token) { awaiter.GetResult(); } public UniTaskStatus GetStatus(short token) { var f = Interlocked.Exchange(ref factory, null); if (f != null) { task = f(); awaiter = task.GetAwaiter(); } return task.Status; } public void OnCompleted(Action<object> continuation, object state, short token) { awaiter.SourceOnCompleted(continuation, state); } public UniTaskStatus UnsafeGetStatus() { return task.Status; } } sealed class DeferPromiseWithState<TState> : IUniTaskSource { Func<TState, UniTask> factory; TState argument; UniTask task; UniTask.Awaiter awaiter; public DeferPromiseWithState(TState argument, Func<TState, UniTask> factory) { this.argument = argument; this.factory = factory; } public void GetResult(short token) { awaiter.GetResult(); } public UniTaskStatus GetStatus(short token) { var f = Interlocked.Exchange(ref factory, null); if (f != null) { task = f(argument); awaiter = task.GetAwaiter(); } return task.Status; } public void OnCompleted(Action<object> continuation, object state, short token) { awaiter.SourceOnCompleted(continuation, state); } public UniTaskStatus UnsafeGetStatus() { return task.Status; } } sealed class DeferPromiseWithState<TState, TResult> : IUniTaskSource<TResult> { Func<TState, UniTask<TResult>> factory; TState argument; UniTask<TResult> task; UniTask<TResult>.Awaiter awaiter; public DeferPromiseWithState(TState argument, Func<TState, UniTask<TResult>> factory) { this.argument = argument; this.factory = factory; } public TResult GetResult(short token) { return awaiter.GetResult(); } void IUniTaskSource.GetResult(short token) { awaiter.GetResult(); } public UniTaskStatus GetStatus(short token) { var f = Interlocked.Exchange(ref factory, null); if (f != null) { task = f(argument); awaiter = task.GetAwaiter(); } return task.Status; } public void OnCompleted(Action<object> continuation, object state, short token) { awaiter.SourceOnCompleted(continuation, state); } public UniTaskStatus UnsafeGetStatus() { return task.Status; } } sealed class NeverPromise<T> : IUniTaskSource<T> { static readonly Action<object> cancellationCallback = CancellationCallback; CancellationToken cancellationToken; UniTaskCompletionSourceCore<T> core; public NeverPromise(CancellationToken cancellationToken) { this.cancellationToken = cancellationToken; if (this.cancellationToken.CanBeCanceled) { this.cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); } } static void CancellationCallback(object state) { var self = (NeverPromise<T>)state; self.core.TrySetCanceled(self.cancellationToken); } public T GetResult(short token) { return core.GetResult(token); } public UniTaskStatus GetStatus(short token) { return core.GetStatus(token); } public UniTaskStatus UnsafeGetStatus() { return core.UnsafeGetStatus(); } public void OnCompleted(Action<object> continuation, object state, short token) { core.OnCompleted(continuation, state, token); } void IUniTaskSource.GetResult(short token) { core.GetResult(token); } } } internal static class CompletedTasks { public static readonly UniTask<AsyncUnit> AsyncUnit = UniTask.FromResult(Cysharp.Threading.Tasks.AsyncUnit.Default); public static readonly UniTask<bool> True = UniTask.FromResult(true); public static readonly UniTask<bool> False = UniTask.FromResult(false); public static readonly UniTask<int> Zero = UniTask.FromResult(0); public static readonly UniTask<int> MinusOne = UniTask.FromResult(-1); public static readonly UniTask<int> One = UniTask.FromResult(1); } }