1

Azure Caching と共に Transient Fault Handling Application Block (TFHAB) を使い始めました。使い方は簡単ですが、デバッガーでは、キャッシュ プロバイダー内でスローされ、一時的ではないとして TFHAB から渡されたエラーによってデバッガーが停止し、「タイプ 'Microsoft.ApplicationServer.Caching.DataCacheException' の例外が MyLib.dll で発生しましたが、処理されませんでした」というメッセージが表示されます。呼び出しがtry/catchブロックでラップされているにもかかわらず、ユーザーコードで。コードは次のようになります。

UserData cacheItem;
try
{
    cacheItem = RetryPolicyFix.ExecuteAction(() => dataCache.GetAndLock(...) as UserData;
}
catch (DataCacheException e)
{
    if (e.ErrorCode == DataCacheErrorCode.ObjectLocked)
        ...
}

コードの他の部分をデバッグしているときに、これらの偽の停止で中断されるのは本当に面倒です。

私は多くの議論を経て、最終的に以下の回避策に行き着きました。

UserData cacheItem;
try
{
    var res = RetryPolicyFix.ExecuteAction(
        () =>
            {
                try
                {
                    var data = dataCache.GetAndLock(...) as UserData;
                    return new TFHResult(data);
                }
                catch (DataCacheException ex)
                {
                    // transient error should pass through as the TFHAB is responsible for its handling
                    if (RetryPolicyFix.ErrorDetectionStrategy.IsTransient(ex))
                        throw;
                    return new TFHResult(ex);
                }
            });

    if (res.Error != null)
        throw res.Error;

    cacheItem = res.Data;
}
catch (DataCacheException e)
{
    if (e.ErrorCode == DataCacheErrorCode.ObjectLocked)
        ...
}

コードはヘルパー構造体を使用します。

private struct TFHResult
{
    public TFHResult(DataCacheException error)
    {
        Error = error;
        Data = null;
    }

    public TFHResult(UserDirectoryMappingData data)
    {
        Error = null;
        Data = data;
    }

    public DataCacheException Error;
    public UserDirectoryMappingData Data;
}

この解決策は見苦しく、ランタイム (デバッガーが接続されていない場合) のパフォーマンスが少し低下し、デバッガーで問題を回避するためだけに不要なコーディングが必要になります。コミュニティの意見をいただければ幸いです。より良いアプローチはありますか?

4

0 に答える 0