繁体   English   中英

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

[英]Task cancelled error when using redis cache in c#

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

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());
}

}

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

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

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

redis.Wait(redis.Open());

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

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

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

我在任务中使用 redis 缓存。延迟传递取消令牌并在第二次操作中设置 redis 缓存我正在获取该缓存并想要取消实际上并没有取消令牌的取消令牌...... 但同样这完全适用于内存缓存

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM