Files
UniTask/src/UniTask.NetCore/NetCore/UniTask.AsValueTask.cs

98 lines
2.5 KiB
C#
Raw Normal View History

2020-05-09 23:22:51 +09:00
#pragma warning disable 0649
2020-06-05 16:45:40 +09:00
using System;
2020-05-09 15:33:46 +09:00
using System.Threading.Tasks;
2020-06-05 16:45:40 +09:00
using System.Threading.Tasks.Sources;
2020-05-09 15:33:46 +09:00
namespace Cysharp.Threading.Tasks
{
public static class UniTaskValueTaskExtensions
{
public static ValueTask AsValueTask(this in UniTask task)
2020-05-09 15:33:46 +09:00
{
2020-06-05 16:45:40 +09:00
#if NETSTANDARD2_0
return new ValueTask(new UniTaskValueTaskSource(task), 0);
#else
return task;
2020-06-05 16:45:40 +09:00
#endif
2020-05-09 15:33:46 +09:00
}
public static ValueTask<T> AsValueTask<T>(this in UniTask<T> task)
2020-05-09 15:33:46 +09:00
{
2020-06-05 16:45:40 +09:00
#if NETSTANDARD2_0
return new ValueTask<T>(new UniTaskValueTaskSource<T>(task), 0);
#else
return task;
2020-06-05 16:45:40 +09:00
#endif
2020-05-09 15:33:46 +09:00
}
public static async UniTask<T> AsUniTask<T>(this ValueTask<T> task)
{
return await task;
}
public static async UniTask AsUniTask(this ValueTask task)
{
await task;
}
2020-06-05 16:45:40 +09:00
#if NETSTANDARD2_0
class UniTaskValueTaskSource : IValueTaskSource
{
readonly UniTask task;
readonly UniTask.Awaiter awaiter;
public UniTaskValueTaskSource(UniTask task)
{
this.task = task;
this.awaiter = task.GetAwaiter();
}
public void GetResult(short token)
{
awaiter.GetResult();
}
public ValueTaskSourceStatus GetStatus(short token)
{
return (ValueTaskSourceStatus)task.Status;
}
public void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags)
{
awaiter.SourceOnCompleted(continuation, state);
}
}
class UniTaskValueTaskSource<T> : IValueTaskSource<T>
{
readonly UniTask<T> task;
readonly UniTask<T>.Awaiter awaiter;
public UniTaskValueTaskSource(UniTask<T> task)
{
this.task = task;
this.awaiter = task.GetAwaiter();
}
public T GetResult(short token)
{
return awaiter.GetResult();
}
public ValueTaskSourceStatus GetStatus(short token)
{
return (ValueTaskSourceStatus)task.Status;
}
public void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags)
{
awaiter.SourceOnCompleted(continuation, state);
}
}
#endif
2020-05-09 15:33:46 +09:00
}
}