将委托传递给具有泛型的方法时,无法将 void 转换为 Task

问题描述 投票:0回答:1

我有以下接受委托的方法:

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”

c# .net asynchronous async-await
1个回答
0
投票

您可以创建一个接受的重载

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

© www.soinside.com 2019 - 2024. All rights reserved.