2

Web ページのデータベース用にプロセス外キャッシュを構築しています。それを使って何かをしようとすると (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 以降では、これには 2 つの主なシナリオがあります。

  • 接続が開かれていないため、メッセージはキューに入れられましたが、後で接続が不可能であることが判明しました
  • 事前条件が失敗したためにトランザクションが発行されなかったか、「監視」キーが変更されたためにトランザクションが中止されました

トランザクションを使用していないため、そもそも接続を開くことができなかったようです。Taskこれは、あなたが戻ってきたものを見ることで確認できますOpen()- 最も簡単に:

redis.Wait(redis.Open());

ここでのWaitメソッドは通常のにtask.Wait()ていますが、タイムアウトのサポートが組み込まれており、生活を便利にする他のいくつかの機能があります。(主に便宜上) 使用することをお勧めします。同様に、 -redis.Wait(method)よりも望ましいmethod.Resultですが、通常はどちらでも問題なく動作します。awaitまたはContinueWith、タスクを実行することもできます-ここでの重要なポイントは、開いたことを確認する必要があることです-それを行う唯一の方法は、Task.

接続には、失敗を検出するためのいくつかのイベント (エラーと閉鎖) があることに注意してください。で接続を開くと便利な場合もありますConnectionUtils。これには、さまざまな一般的なシナリオの処理が組み込まれています。

最終的な観察結果: ... API をバージョン管理/リファクタリングするときに、古いデータを読み込めないことに気付くかもしれBinaryFormatterません。警告しなかったとは言わないでください。.NET、または protobuf-net (後者は密なバイナリであり、redis などの不透明なアウトプロセス BLOB に理想的ですが、作成者はトラブルにすぎないと聞きます)。XmlSerializerDataContractSerializer

于 2013-05-17T20:36:38.057 に答える