我为网页的数据库构建了一个进程外缓存。虽然当我尝试使用它(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());
}
}
答案 0 :(得分:2)
“已取消”状态表示邮件已排队但无法写入流(例如,流从未打开过)。从1.3开始,有两个主要方案:
由于您没有使用交易,因此听起来无法首先打开连接。您可以通过查看Task
Open()
来查看此问题,最简单的方法是:
redis.Wait(redis.Open());
这里的Wait
方法就像通常的task.Wait()
一样,但它有内置的超时支持,还有其他一些让生活方便的东西 - 我鼓励它的用法(主要是为了方便);同样地,redis.Wait(method)
优于method.Result
- 但通常都可以正常工作。您还可以await
或ContinueWith
任务 - 这里的关键点是您需要检查它是否已打开 - 唯一的方法就是看看会发生什么使用Task
。
请注意,连接有一些事件可用于检测故障(错误和关闭)。您也可以找到它来打开与ConnectionUtils
的连接,该连接具有针对一系列常见场景的内置处理。
最后观察:BinaryFormatter
...当您对API进行版本/重构时,您可能无法加载旧数据 - 不要说我没有警告您; p我会推荐任何基于合同的序列化器代替:XmlSerializer
,DataContractSerializer
,JSON.NET或protobuf-net(后者是密集二进制文件 - 非常适用于不透明的进程外BLOB,例如: redis,虽然我听说作者只不过是麻烦了。)