相关疑难解决方法(0)

使用泛型类型作为异步方法的返回类型

之前的一个问题让我想知道为什么以下方法会引发编译时错误:

异步方法的返回类型必须为void,Task或Task

public async T MyMethodAsync<T>() where T : Task
{
     // Irrelevant code here which returns a Task
}
Run Code Online (Sandbox Code Playgroud)

既然我们在编译时知道T总是一个Task或派生类型,为什么这不起作用呢?

编辑

我问的原因是方法可能返回a Task或a Task<T>.假设该方法可以返回,我不想重复代码.

当然,这完全是理论上的,而不是用于生产目的.

编辑2

Lucian Wischik发现了一篇很棒的文章: 为什么必须异步返回Task

.net c# generics async-await

10
推荐指数
1
解决办法
3134
查看次数

具有功能的 Polly 重试策略不等待结果

我正在尝试将我现有的函数转换为 Polly Retry 策略

public static T Execute<T>(Func<T> getTask) where T : Task
{
    var retryCount = 3;
    while (retryCount-- > 0)
    {
        try
        {
            getTask().Wait();
            return getTask();
        } catch(Exception ex){
            // handle retry
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

转换成这个

public static T Execute<T>(Func<T> func) where T : Task
{
    var task = func();
    Policy.Handle<HttpRequestException>()
        .Or<TimeoutException>()
        .WaitAndRetryAsync(
            3,
            retryAttempt => TimeSpan.FromSeconds(Math.Pow(5, retryAttempt)),
            (exception, timeSpan, retryCount, context) =>
            {
                //do some logging
            })
        .ExecuteAsync(func).Wait();
    return task;
}
Run Code Online (Sandbox Code Playgroud)

和测试代码是

var retryCount = 0;
var …
Run Code Online (Sandbox Code Playgroud)

c# policy retrypolicy polly

5
推荐指数
1
解决办法
7160
查看次数

标签 统计

c# ×2

.net ×1

async-await ×1

generics ×1

policy ×1

polly ×1

retrypolicy ×1