河合 宜文 / Kawai Yoshifumi / @neuecc
Cysharp, Inc.
Cygames
C#大統一理論
C#
C#の可能性を切り開いていく
https://github.com/Cysharp
A Brief History of
UniRx/UniTask
https://twitter.com/neuecc/status/445836676791689216
IUniTaskSource in Depth
public readonly struct UniTask<T>
{
readonly T result;
readonly IUniTaskSource<T> source;
readonly short token;
}
public readonly struct UniTask<T>
{
readonly T result;
readonly IUniTaskSource<T> source;
readonly short token;
}
public readonly struct UniTask<T>
{
readonly T result;
readonly IUniTaskSource<T> source;
readonly short token;
}
public interface IUniTaskSource<out T>
{
T GetResult(short token);
UniTaskStatus GetStatus(short token);
void OnCompleted(Action<object> continuation, object state, short token);
}
internal sealed class AsyncUniTask<TStateMachine, T> :
IStateMachineRunnerPromise<T>, ITaskPoolNode<AsyncUniTask<TStateMachine, T>>,
IUniTaskSource<T> where TStateMachine : IAsyncStateMachine
{
public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPro
{
// プールから取得する
if (!pool.TryPop(out var result))
{
result = new AsyncUniTask<TStateMachine, T>();
}
}
public T GetResult(short token)
{
try
{
return core.GetResult(token);
}
finally
{
core.Reset(); // core.version++
return pool.TryPush(this); // プールに返す}
}
}
internal sealed class AsyncUniTask<TStateMachine, T> :
IStateMachineRunnerPromise<T>, ITaskPoolNode<AsyncUniTask<TStateMachine, T>>,
IUniTaskSource<T> where TStateMachine : IAsyncStateMachine
{
public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPro
{
// プールから取得する
if (!pool.TryPop(out var result))
{
result = new AsyncUniTask<TStateMachine, T>();
}
}
public T GetResult(short token)
{
try
{
return core.GetResult(token);
}
finally
{
core.Reset(); // core.version++
return pool.TryPush(this); // プールに返す}
}
}
public interface IUniTaskSource<out T>
{
T GetResult(short token);
UniTaskStatus GetStatus(short token);
void OnCompleted(Action<object> continuation, object state, short token);
}
public readonly struct UniTask<T>
{
readonly T result;
readonly IUniTaskSource<T> source;
readonly short token;
}
public interface IUniTaskSource<out T>
{
T GetResult(short token);
UniTaskStatus GetStatus(short token);
void OnCompleted(Action<object> continuation, object state, short token);
}
public readonly struct UniTask<T>
{
readonly T result;
readonly IUniTaskSource<T> source;
readonly short token;
}
public interface IUniTaskSource<out T>
{
T GetResult(short token);
UniTaskStatus GetStatus(short token);
void OnCompleted(Action<object> continuation, object state, short token);
}
public readonly struct UniTask<T>
{
readonly T result;
readonly IUniTaskSource<T> source;
readonly short token;
}
if (token != version)
{
throw new InvalidOperationException(
"Token version is not matched,
can not await twice or get Status after await.“
);
}
sealed class DelayPromise : IUniTaskSource,
IPlayerLoopItem, ITaskPoolNode<DelayPromise>
A Brief History of UniRx/UniTask, IUniTaskSource in Depth

A Brief History of UniRx/UniTask, IUniTaskSource in Depth

  • 2.
    河合 宜文 /Kawai Yoshifumi / @neuecc Cysharp, Inc. Cygames C#大統一理論 C#
  • 3.
  • 4.
    A Brief Historyof UniRx/UniTask
  • 5.
  • 8.
  • 9.
    public readonly structUniTask<T> { readonly T result; readonly IUniTaskSource<T> source; readonly short token; }
  • 10.
    public readonly structUniTask<T> { readonly T result; readonly IUniTaskSource<T> source; readonly short token; }
  • 11.
    public readonly structUniTask<T> { readonly T result; readonly IUniTaskSource<T> source; readonly short token; }
  • 12.
    public interface IUniTaskSource<outT> { T GetResult(short token); UniTaskStatus GetStatus(short token); void OnCompleted(Action<object> continuation, object state, short token); }
  • 13.
    internal sealed classAsyncUniTask<TStateMachine, T> : IStateMachineRunnerPromise<T>, ITaskPoolNode<AsyncUniTask<TStateMachine, T>>, IUniTaskSource<T> where TStateMachine : IAsyncStateMachine { public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPro { // プールから取得する if (!pool.TryPop(out var result)) { result = new AsyncUniTask<TStateMachine, T>(); } } public T GetResult(short token) { try { return core.GetResult(token); } finally { core.Reset(); // core.version++ return pool.TryPush(this); // プールに返す} } }
  • 14.
    internal sealed classAsyncUniTask<TStateMachine, T> : IStateMachineRunnerPromise<T>, ITaskPoolNode<AsyncUniTask<TStateMachine, T>>, IUniTaskSource<T> where TStateMachine : IAsyncStateMachine { public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPro { // プールから取得する if (!pool.TryPop(out var result)) { result = new AsyncUniTask<TStateMachine, T>(); } } public T GetResult(short token) { try { return core.GetResult(token); } finally { core.Reset(); // core.version++ return pool.TryPush(this); // プールに返す} } }
  • 15.
    public interface IUniTaskSource<outT> { T GetResult(short token); UniTaskStatus GetStatus(short token); void OnCompleted(Action<object> continuation, object state, short token); } public readonly struct UniTask<T> { readonly T result; readonly IUniTaskSource<T> source; readonly short token; }
  • 16.
    public interface IUniTaskSource<outT> { T GetResult(short token); UniTaskStatus GetStatus(short token); void OnCompleted(Action<object> continuation, object state, short token); } public readonly struct UniTask<T> { readonly T result; readonly IUniTaskSource<T> source; readonly short token; }
  • 17.
    public interface IUniTaskSource<outT> { T GetResult(short token); UniTaskStatus GetStatus(short token); void OnCompleted(Action<object> continuation, object state, short token); } public readonly struct UniTask<T> { readonly T result; readonly IUniTaskSource<T> source; readonly short token; } if (token != version) { throw new InvalidOperationException( "Token version is not matched, can not await twice or get Status after await.“ ); }
  • 18.
    sealed class DelayPromise: IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayPromise>