1

我开始将瞬态故障处理应用程序块 (TFHAB) 与 Azure 缓存一起使用。它很容易使用,但是在调试器中时,缓存提供程序中抛出的错误并从 TFHAB 传递出来的错误不是瞬态停止调试器声称“MyLib.dll 中发生'Microsoft.ApplicationServer.Caching.DataCacheException'类型的异常但未处理”在用户代码中'尽管调用被包装在 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