C# 异步延迟立即获得结果

C# 异步延迟立即获得结果,c#,asp.net,.net,lazy-initialization,C#,Asp.net,.net,Lazy Initialization,我有以下资料: public class User { private readonly Lazy<Task<List<ReminderDb>>> _reminders; public SmsUserDb() { // Get _reminderReader from IoC _reminders = new Lazy<Task<List<R

我有以下资料:

public class User 
{
        private readonly Lazy<Task<List<ReminderDb>>> _reminders;

        public SmsUserDb()
        {
            // Get _reminderReader from IoC

            _reminders = new Lazy<Task<List<ReminderDb>>>(async () => (List<ReminderDb>)await _reminderReader.Get(UserId));
        }

        public string UserId { get; set; }
        public Task<List<ReminderDb>> Reminders => _reminders.Value;
}
这段代码有效,我看到n.提醒=等待激活,直到我点击等待n.提醒行

但是,当我从缓存中查询此用户对象时,如下所示:

        var n1 = await _userReader.GetUserFromCache("+17084556675"); // return SmsUserDb
        var n2 = await n1.Reminders;
当它点击GetUserFromCache时,它会立即调用_rementerreader.GetUserId,它会再次调用cache以获取提醒。然后它就会超时。所以懒惰不起作用,很可能导致死锁

public async Task<SmsUserDb> GetUserFromCache(string phoneNumber)
{
    var hash = CachedObjectType.smsuser.ToString();
    var fieldKey = string.Format($"{CachedObjectType.smsuser.ToString()}:user-{phoneNumber}");
    var result = await _cacheUserService.GetHashedAsync(hash, fieldKey);
    return result;
}

    private async Task<List<ReminderDb>> GetRemindersFromCache(string userId)
    {
        var hash = CachedObjectType.smsreminder.ToString();
        var fieldKey = string.Format($"{CachedObjectType.smsreminder.ToString()}:user-{userId}");
        var result = await _cacheService.GetHashedAsync(hash, fieldKey);
        return result ?? new List<ReminderDb>();
    }

有什么问题吗?

在下面显示的测试代码中,这些都可以正常工作。因此,该错误一定存在于您尚未向我们展示的某些代码中

下面是一些有效的示例代码——它证明了Lazy工作正常。因此,错误在代码的其他地方

您必须发布可编译的复制,以便任何人都能帮助您完成此操作

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

namespace Demo
{
    public class ReminderDb
    {
        public string Value;
    }

    public class ReminderReader
    {
        public async Task<List<ReminderDb>> Get(string userId)
        {
            Console.WriteLine("In Get() for " + userId);
            await Task.Delay(1000);
            Console.WriteLine("Returning from Get()");
            return new List<ReminderDb>{new ReminderDb{Value = userId}};
        }
    }

    public class Cache
    {
        public void Add(string key, SmsUserDb value)
        {
            _cache.Add(key, value);
        }

        public async Task<SmsUserDb> GetHashedAsync(string key)
        {
            await Task.Delay(1000);
            return _cache[key];
        }

        readonly Dictionary<string, SmsUserDb> _cache = new Dictionary<string, SmsUserDb>();
    }

    public class SmsUserDb
    {
        readonly Lazy<Task<List<ReminderDb>>> _reminders;
        readonly ReminderReader _reminderReader = new ReminderReader();

        public SmsUserDb()
        {
            _reminders = new Lazy<Task<List<ReminderDb>>>(async () => (List<ReminderDb>) await _reminderReader.Get(UserId));
        }

        public string                 UserId    { get; set; }
        public Task<List<ReminderDb>> Reminders => _reminders.Value;
    }

    static class Program
    {
        static async Task Main()
        {
            var db = new SmsUserDb(){UserId = "user ID"};
            var cache = new Cache();
            cache.Add("key", db);

            Console.WriteLine("Press RETURN to await cache.GetHashedAsync()");
            Console.ReadLine();
            var result = await cache.GetHashedAsync("key");

            Console.WriteLine("Press RETURN to await Reminders[0].Value");
            Console.ReadLine();
            Console.WriteLine((await result.Reminders)[0].Value);
        }
    }
}

发现了问题。我使用同一个类写入缓存,即:

public class User 
{
        private readonly Lazy<Task<List<ReminderDb>>> _reminders;

        public SmsUserDb()
        {
            // Get _reminderReader from IoC

            _reminders = new Lazy<Task<List<ReminderDb>>>(async () => (List<ReminderDb>)await _reminderReader.Get(UserId));
        }

        public string UserId { get; set; }
        public Task<List<ReminderDb>> Reminders => _reminders.Value;
}
在使用不同的类来写下面的内容和读上面的内容之后,所有的工作都按照需要进行。谢谢

public class CacheUser {
    public string UserId { get; set; }
    public List<ReminderDb> Reminders {get; set; }
}

那么GetUserFromCache做什么呢?只是从缓存中获取用户,我已经添加了这个方法。但我的意图是,在我执行等待用户的命令之前,不会调用提醒属性;此外,如果我从SmsUserDb对象中删除提醒属性,它也可以正常工作。好像是那个懒汉造成了问题。问题不清楚,代码不完整。这到底是什么?\u rementerreader.GetUserId?\u rementerreader.GetUserId只是调用this=>getrementersfromCache这一切在我的测试代码中都可以正常工作。该错误一定与缓存数据的方式有关。可能是序列化/反序列化吗?您需要发布一个完整的可编译示例,因为您实际发布的所有代码都可以正常工作。
public class CacheUser {
    public string UserId { get; set; }
    public List<ReminderDb> Reminders {get; set; }
}