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