无法将Redis.RedisValue转换为Task <t>

时间:2018-10-31 19:17:47

标签: c# .net task-parallel-library stackexchange.redis

我正在尝试编写一个通用类/接口,该类/接口将从Redis缓存中获取数据。我试图使其通用,因为我们拥有不同类型的数据,并且很难为每种数据类型编写这么多的类。

这是我的界面和类。

public interface IRedisCache<T>
{
    Task<T> GetValue(string code);
}

public class RedisCache<T> : IRedisCache<T>
{

    public RedisCache()
    {

    }

    public Task<T> GetValue(string code)
    {
        var cache = RedisConnectorHelper.Connection.GetDatabase();
        var value = cache.StringGet($"Device_Status:{code}");

        Task<T> myTask = (Task<T>)value;

        return myTask;
    }

}

我正遇到以下问题:

Task<T> myTask = (Task<T>)value;

问题在于将Redis.RedisValue类型转换为Task<T>类型。

我收到错误消息

  

“无法将Redis.Redisvalue类型转换为System.Threading.Tasks.Task<T>

我正在使用带有点网核心2的Stack Exchange.Redis库。

1 个答案:

答案 0 :(得分:2)

假设该值最初以JSON形式存储在缓存中,

cache.StringSet($"Device_Status:{code}", JsonConvert.SerializeObject(myObject)));

然后只需将返回值反序列化为所需的类型

public async Task<T> GetValue(string code) {
    var cache = RedisConnectorHelper.Connection.GetDatabase();
    var value = await cache.StringGetAsync($"Device_Status:{code}");
    T resultFromCache = JsonConvert.DeserializeObject<T>(value);
    return resultFromCache;
}

我建议将缓存服务重构为

public interface IRedisCache {
    Task<T> GetValue<T>(string code);
}

使用上述建议实施

public class RedisCache : IRedisCache {
    public async Task<T> GetValue<T>(string code) {
        var cache = RedisConnectorHelper.Connection.GetDatabase();
        var value = await cache.StringGetAsync($"Device_Status:{code}");
        T resultFromCache = JsonConvert.DeserializeObject<T>(value);
        return resultFromCache;
    }
}