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

时间:2013-05-17 11:45:22

标签: c# redis azure-caching booksleeve

我为网页的数据库构建了一个进程外缓存。虽然当我尝试使用它(Set,Get)时,我收到以下错误:

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 个答案:

答案 0 :(得分:2)

“已取消”状态表示邮件已排队但无法写入流(例如,流从未打开过)。从1.3开始,有两个主要方案:

  • 邮件已排队,因为连接未打开,后来发现连接无法连接
  • 由于前提条件失败或由于“监视”键已更改而中止,因此未发出交易

由于您没有使用交易,因此听起来无法首先打开连接。您可以通过查看Task Open()来查看此问题,最简单的方法是:

redis.Wait(redis.Open());

这里的Wait方法就像通常的task.Wait() 一样,但它有内置的超时支持,还有其他一些让生活方便的东西 - 我鼓励它的用法(主要是为了方便);同样地,redis.Wait(method)优于method.Result - 但通常都可以正常工作。您还可以awaitContinueWith任务 - 这里的关键点是您需要检查它是否已打开 - 唯一的方法就是看看会发生什么使用Task

请注意,连接有一些事件可用于检测故障(错误和关闭)。您也可以找到它来打开与ConnectionUtils的连接,该连接具有针对一系列常见场景的内置处理。

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