代码之家  ›  专栏  ›  技术社区  ›  Aleksander Chelpski

ValueType只能等待一次,这意味着什么?

  •  0
  • Aleksander Chelpski  · 技术社区  · 2 年前

    我想使用 ValueTask 。我在某个地方发现“ValueTask只能等待一次”。我等不及这个方法了 GetMoney 多次还是什么?如果是,我应该如何更改代码?

    public class CreditCardService
    {
        private Dictionary<int, int> _cache = new Dictionary<int, int>()
        {
            { 1, 500 },
            { 2, 600 }
        };
    
        public async ValueTask<int> GetMoney(int userId)
        {
            if (_cache.ContainsKey(userId))
            {
                return _cache[userId];
            }
    
            //some asynchronous operation:
            Random rnd = new Random();
            var money = rnd.Next(100);
    
            _cache[userId] = money;
            return await Task.FromResult(money);
        }
    }
    
    var creditCardService = new CreditCardService();
    Console.WriteLine(await creditCardService.GetMoney(1));
    Console.WriteLine(await creditCardService.GetMoney(3));
    Console.WriteLine(await creditCardService.GetMoney(3));
    
    2 回复  |  直到 2 年前
        1
  •  3
  •   knittl    2 年前

    您正等待每项任务一次:

    var creditCardService = new CreditCardService();
    Console.WriteLine(await creditCardService.GetMoney(1)); // a new ValueTask
    Console.WriteLine(await creditCardService.GetMoney(3)); // a new ValueTask
    Console.WriteLine(await creditCardService.GetMoney(3)); // a new ValueTask
    

    以下将多次等待单个任务:

    var creditCardService = new CreditCardService();
    var money1Task = creditCardService.GetMoney(1)
    Console.WriteLine(await money1Task);
    Console.WriteLine(await money1Task);
    
        2
  •  3
  •   wohlstad    2 年前

    每次你打电话 GetMoney 你得到了一个新的 ValueTask 例子

    然后你等待每一个 ValueTask 实例正好一次。

    因此,您的代码没有违反此规则。

    为了违反规则,您需要 await 相同的 ValueTask 实例不止一次。

    有关的更多信息 ValueTask s可以在这里找到。NET博客: Understanding the Whys, Whats, and Whens of ValueTask .