我有以下接受委托的方法:
public async Task<T> ExecuteWithRetryAsync<T>(Func<Task<T>> action)
{
try
{
return await _retryPolicy.ExecuteAsync(async () =>
{
return await action();
});
}
catch (HttpRequestException)
{
return default(T);
//log this to queue
}
}
通常我这样称呼它并且效果很好:
var saleCheckResult = await ExecuteWithRetryAsync(async () => await _client.CheckSaleAsync(SaleId));
这是我要传递的代表:
public virtual System.Threading.Tasks.Task<SaleCheckResult> CheckSaleAsync(string saleId)
{
return CheckSaleAsync(saleId, System.Threading.CancellationToken.None);
}
问题在于,我想将以下方法作为委托传递给重试执行:
public virtual System.Threading.Tasks.Task DisableMachineAsync(string machineId)
{
return DisableMachineAsync(machineId, System.Threading.CancellationToken.None);
}
我使用相同的逻辑来称呼它:
await ExecuteWithRetryAsync(async () => await _client.DisableMachineAsync(machineId));
我收到以下错误“无法从使用中推断出方法的类型参数尝试显式指定参数”,我知道我应该指定参数,所以我尝试了这个,因为委托返回了一个任务
await ExecuteWithRetryAsync<Task>(async () => await _client.DisableMachineAsync(machineId))
现在我得到一个错误无法隐式地将 void 转换为 Task,我不明白我不能使用 void 作为类型参数,所以我如何确保传递正确的委托。为什么它告诉我它想要将 void 转换为 Task,委托正在返回 Task 以及 ExecuteWithRetry,我该如何进行编译。我在这里找到了类似的帖子,但问题有点不同无法将类型“void”隐式转换为“System.Threading.Tasks.Task”
您可以创建一个接受的重载
Func<Task>
:
async Task ExecuteWithRetryAsync(Func<Task> action)
{
try
{
await _retryPolicy.ExecuteAsync(async () =>
{
await action();
});
}
catch (HttpRequestException)
{
//log this to queue
}
}
并让编译器根据提供的函数选择重载。
为什么它告诉我它要将 void 转换为 Task
因为此调用
await ExecuteWithRetryAsync<Task>
需要返回类型为 Task<Task>
,而等待 Task
结果为 void
。