代码改变世界

一个简单的 ValueTask 的示例

2019-07-30 18:20  音乐让我说  阅读(556)  评论(0编辑  收藏  举报

 Task 确实有潜在的缺点,特别是对于实例创建很多  并且高吞吐量和性能是关键问题的场景  :  Task 是一个类。作为一个类,这意味着任何需要创建一个对象的操作都需要分配一个对象,分配的对象越多,垃圾收集器(GC)需要做的工作就越多,我们花在它上面的资源就越多可以花在做其他事情上。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ValueTaskSample
{
    class Program
    { 
        static async Task Main(string[] args)
        {
            for (int i = 0; i < 20; i++)
            {
                IEnumerable<string> data = await GetSomeDataAsync();
                await Task.Delay(1000);
            }
            Console.ReadLine();
        }

        private static DateTime _retrieved;
        private static IEnumerable<string> _cachedData;
        public static async ValueTask<IEnumerable<string>> GetSomeDataAsync()
        {
            if (_retrieved >= DateTime.Now.AddSeconds(-5))
            {
                Console.WriteLine("{0} : data from the cache", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                return await new ValueTask<IEnumerable<string>>(_cachedData);
            }

            Console.WriteLine("{0} : data from the service.", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            (_cachedData, _retrieved) = await GetTheRealData();
            return _cachedData;
        }

        public static Task<(IEnumerable<string> data, DateTime retrievedTime)> GetTheRealData() =>
            Task.FromResult(
                (Enumerable.Range(0, 10)
                    .Select(x => $"item {x}").AsEnumerable(),
                DateTime.Now));
    }
}

 

 

参考:https://devblogs.microsoft.com/dotnet/understanding-the-whys-whats-and-whens-of-valuetask/