// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information. using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace System.Linq { public static partial class AsyncEnumerable { public static IAsyncEnumerable ToAsyncEnumerable(this Task task) { if (task == null) throw Error.ArgumentNull(nameof(task)); return new TaskToAsyncEnumerable(task); } private sealed class TaskToAsyncEnumerable : AsyncIterator { private readonly Task _task; private int _called; public TaskToAsyncEnumerable(Task task) => _task = task; public override AsyncIteratorBase Clone() => new TaskToAsyncEnumerable(_task); protected override async ValueTask MoveNextCore() { if (Interlocked.CompareExchange(ref _called, 1, 0) == 0) { _current = await _task.ConfigureAwait(false); return true; } return false; } } } }