之前的一个问题让我想知道为什么以下方法会引发编译时错误:
异步方法的返回类型必须为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
我正在尝试将我现有的函数转换为 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)