簡體   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