C# Polly策略的扩展方法

C# Polly策略的扩展方法,c#,polly,C#,Polly,我试图找到为Polly策略编写扩展方法的最佳方法 我有以下几点 public static async Task<IPollyDto> RunAsync(this IPolicy dtoClass, Func<Task<IDto>> action) { return await Policy .Handle<ApiException>(ex => ex.StatusCode == HttpSta

我试图找到为Polly策略编写扩展方法的最佳方法

我有以下几点

public static async Task<IPollyDto> RunAsync(this IPolicy dtoClass, Func<Task<IDto>> action)
{
    return
        await Policy
            .Handle<ApiException>(ex => ex.StatusCode == HttpStatusCode.RequestTimeout)
            .RetryAsync(3,
                async (exception, retryCount) => await Task.Delay(200))
            .ExecuteAsync(async () => await action.Invoke().ConfigureAwait(false))
            .ConfigureAwait(false);
}

public interface IPollyDto {}
public interface IPolicy {}
publicstaticasync任务RunAsync(此ipolicydtoclass,Func操作)
{
返回
等待政策
.Handle(ex=>ex.StatusCode==HttpStatusCode.RequestTimeout)
.RetryAsync(3,
异步(异常,retryCount)=>等待任务。延迟(200))
.ExecuteAsync(异步()=>await action.Invoke().ConfigureAwait(false))
.配置等待(错误);
}
公共接口IPollyDto{}
公共接口IPolicy{}
然后我调用代码如下

public class DtoTest : IPollyDto
{
}

public class TestA
{
    public static async Task<DtoTest> GetItem(string datasetName)
    {
        return await Task.Run(() => new DtoTest()) ;
    }
}

public class PollyTest : IPolicy
{
    public async Task<DtoTest> TestMe(string dataset)
    {
       return (DtoTest) await this.RunAsync(() => Task.Run(() => (IPollyDto) TestA.GetItem(dataset)));
    }
}
公共类DtoTest:IPollyDto
{
}
公共类遗嘱
{
公共静态异步任务GetItem(字符串datasetName)
{
返回等待任务。运行(()=>newdtotest());
}
}
公共类PollyTest:IPolicy
{
公共异步任务TestMe(字符串数据集)
{
return(DtoTest)等待这个.RunAsync(()=>Task.Run(()=>(IPollyDto)TestA.GetItem(dataset));
}
}

我在解析类型时出错。

您的
this.RunAsync(()=>Task.Run(()=>(IPollyDto)TestA.GetItem(dataset))调用中缺少
async wait
。将其更改为:

this.RunAsync(() => Task.Run(async () => (IPollyDto)(await TestA.GetItem(dataset))));
或者只是:

this.RunAsync(async () => (IPollyDto)(await TestA.GetItem(dataset)))

感谢Guru Stron,我得到了一个编译时错误,我需要将其更改为return(DtoTest)wait this;但是当executing@MicroMan是的,您的其余代码应该保持不变。请参阅fiddle,我已将
Func action
更改为
RunAsync
中的
Func action
,原因
IDto
未定义。