Files
ThingsGateway/src/Admin/ThingsGateway.NewLife.X/PooledAwait/PooledValueTaskT.cs
2025-10-18 03:18:45 +08:00

86 lines
3.2 KiB
C#

using PooledAwait.Internal;
using System.Runtime.CompilerServices;
namespace PooledAwait
{
/// <summary>
/// A ValueTask<typeparamref name="T"/> with a custom source and builder
/// </summary>
[AsyncMethodBuilder(typeof(MethodBuilders.PooledValueTaskMethodBuilder<>))]
public readonly struct PooledValueTask<T>
{
/// <summary><see cref="Object.Equals(Object)"/></summary>
public override bool Equals(object? obj) => obj is PooledValueTask<T> pvt && _source == pvt._source && _token == pvt._token;
/// <summary><see cref="Object.GetHashCode"/></summary>
public override int GetHashCode() => (_source == null ? 0 : _source.GetHashCode()) ^ _token;
/// <summary><see cref="Object.ToString"/></summary>
public override string ToString() => nameof(PooledValueTask);
private readonly PooledState<T>? _source;
private readonly short _token;
private readonly T _result;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal PooledValueTask(PooledState<T> source, short token)
{
_source = source;
_token = token;
_result = default!;
}
/// <summary>
/// Creates a value-task with a fixed value
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public PooledValueTask(T result)
{
_source = default;
_token = default;
_result = result;
}
/// <summary>
/// Gets the instance as a value-task
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ValueTask<T> AsValueTask() => _source == null ? new ValueTask<T>(_result) : new ValueTask<T>(_source, _token);
/// <summary>
/// Gets the instance as a value-task
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static implicit operator ValueTask<T>(in PooledValueTask<T> task) => task.AsValueTask();
/// <summary>
/// Gets the awaiter for the task
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
#pragma warning disable CA2012 // 正确使用 ValueTask
public ValueTaskAwaiter<T> GetAwaiter() => AsValueTask().GetAwaiter();
#pragma warning restore CA2012 // 正确使用 ValueTask
/// <summary>
/// Gets the configured awaiter for the task
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ConfiguredValueTaskAwaitable<T> ConfigureAwait(bool continueOnCapturedContext)
=> AsValueTask().ConfigureAwait(continueOnCapturedContext);
/// <summary>
/// Rents a task-source that will be recycled when the task is awaited
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static PooledValueTaskSource<T> CreateSource() => PooledValueTaskSource<T>.Create();
/// <summary>
/// Indicates whether this is an invalid default instance
/// </summary>
public bool IsNull
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => _source == null;
}
}
}