| File: AsyncLazy.cs | Web Access |
| Project: src\nuget-client\src\NuGet.Core\NuGet.Common\NuGet.Common.csproj (NuGet.Common) |
// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace NuGet.Common { /// <summary> /// Wrapper class representing shorter syntax of Lazy<Task<T>>"/>. /// Useful when declaring a lazy async factory of value T. /// </summary> /// <typeparam name="T">Value type</typeparam> [CLSCompliant(true)] public class AsyncLazy<T> { private readonly Lazy<Task<T>> _inner; public AsyncLazy(Func<Task<T>> valueFactory) { _inner = new Lazy<Task<T>>(valueFactory); } public AsyncLazy(Lazy<Task<T>> inner) { _inner = inner; } public TaskAwaiter<T> GetAwaiter() => _inner.Value.GetAwaiter(); public static implicit operator Lazy<Task<T>>(AsyncLazy<T> outer) => outer._inner; // implicit conversion } /// <summary> /// Shortcuts to common Lazy<Task<T>> constructor calls /// </summary> public static class AsyncLazy { public static AsyncLazy<T> New<T>(Func<Task<T>> asyncValueFactory) => new AsyncLazy<T>(asyncValueFactory); public static AsyncLazy<T> New<T>(Func<T> valueFactory) => new AsyncLazy<T>(() => Task.Run(valueFactory)); public static AsyncLazy<T> New<T>(Lazy<Task<T>> inner) => new AsyncLazy<T>(inner); public static AsyncLazy<T> New<T>(T innerData) => new AsyncLazy<T>(() => Task.FromResult(innerData)); } }