2

我为我的网页数据库构建了一个进程外缓存。虽然当我尝试用它做某事(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());
}

}

4

1 回答 1

2

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

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

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

redis.Wait(redis.Open());

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

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

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

于 2013-05-17T20:36:38.057 回答