c# - 在c#中使用redis缓存时任务取消错误

标签 c# redis azure-caching booksleeve

我为我的网页数据库构建了一个进程外缓存。虽然当我尝试用它做一些事情(设置、获取)时,我收到以下错误:

A task was canceled

这是我的 redis 缓存代码。任何帮助都会很棒。谢谢

public class RedisCache : ICache
{
    private RedisConnection redis;

public RedisCache()
{
    redis = new RedisConnection("127.0.0.1");
    redis.Open();
}

public object Get(string key)
{
    var method = redis.Strings.Get(0, key);
    if (method == null)
        return null;
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream(method.Result);
    object obj = bf.Deserialize(ms);
    return obj;
}

public void Set(string key, object value)
{
    MemoryStream ms = new MemoryStream();
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(ms, value);
    redis.Strings.Set(0, key, ms.ToArray());
}

}

最佳答案

“已取消”状态意味着消息已排队,但无法写入流(例如,流从未打开)。从 1.3 开始,主要有 2 个场景:

  • 消息排队因为连接未打开,后来发现连接不可能
  • 由于先决条件失败,交易未发出,或由于“watch”键更改而中止

由于您没有使用事务,因此听起来连接一开始就无法打开。您可以通过查看从 Open() 返回的 Task 来检查这一点 - 最简单的是:

redis.Wait(redis.Open());

这里的 Wait 方法类似于通常的 task.Wait(),但它具有内置的超时支持,以及一些其他功能让生活变得方便 - 我确实鼓励使用它(主要是为了方便);同样,redis.Wait(method)method.Result 更好 - 但通常都可以正常工作。您还可以等待ContinueWith任务 - 这里的关键点是您需要检查它是否打开 - 这是唯一的方法即通过查看任务发生了什么。

请注意,连接有一些用于检测失败的事件(错误和关闭)。您可能还会发现使用 ConnectionUtils 打开连接很方便,它对一系列常见场景有一些内置处理。

最后观察:BinaryFormatter ...您可能会发现,当您版本/重构 API 时,您无法加载旧数据 - 不要说我没有警告您;p 我会推荐任何基于契约的序列化器:XmlSerializerDataContractSerializer、JSON.NET 或 protobuf-net(后者是密集的二进制文件 - 非常适合不透明的进程外BLOB比如redis,虽然我听说作者只是麻烦)。

关于c# - 在c#中使用redis缓存时任务取消错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16608207/

相关文章:

azure - 在 Web 角色中使用 HttpSessionState

Azure 表存储和缓存

c# - 使用可变参数使此方法通用

c# - 如何在 C# 的定时器的 Tick 事件中调用接收参数的方法?

Redis StackExchange 客户端 - 频繁接收 "Timeout exceptions", "Redis connection exception", "No connection available to service"

node.js - redis 会删除我旧的 express.js session 吗?

redis - 为什么我的 redis 命令键不会阻止我的其他操作

azure - 使用 Azure 缓存调试 Web 应用程序

c# - 参数类型不能分配给参数类型,尽管它继承

c# - asp.net 网站中的静态字段问题