如何将方法传递给另一个接受Func的方法?

时间:2017-11-20 16:06:32

标签: c#

我有这种方法:

RateLimiter.Perform(Func<Task> perform)

我想执行此方法:

await PassMessageAsync(message, id, name)

它没有显示错误,只是为了确保,这是正确的方法吗?:

await RateLimiter.Perform(async () => { await PassMessageAsync(message, id, name);});

更新

这个想法是限制并发方法的数量。

public async Task<T> Perform<T>(Func<Task<T>> perform, CancellationToken cancellationToken) 
{
    cancellationToken.ThrowIfCancellationRequested();
    using (await _AwaitableConstraint.WaitForReadiness(cancellationToken)) 
    {
        return await perform();
    }
}

如何更改签名以接受包含任何参数的任何方法,并等待它?

1 个答案:

答案 0 :(得分:1)

由于到目前为止根本没有答案,我将尝试回答您的具体问题。关于:

await RateLimiter.Perform(async () => { await PassMessageAsync(message, id, name);});
  

它没有显示错误,只是为了确保,这是正确的方法吗?:

这样可行,但lambda不需要async。你只需传递一些可以等待的东西,例如: Task / Task<T>

await RateLimiter.Perform(() => PassMessageAsync(message, id, name));

通过这样做,您可以使代码更清晰,并消除额外的await

  

如何更改签名以接受任何方法   参数,并等待它?

你可能用动力学或一些这样的松散打字来管理这个,但我不会。您可以做的是改变您传入的内容以匹配您拥有的签名。碰巧,这正是您在创建lambda语句时所做的。

那么这是如何回答你的问题的呢?好吧,假设我们只对传递返回TaskTask<T>Perform的方法感兴趣,则需要两种方法:每种方法一种。您已经拥有Task<T>的功能。 Task的功能如下所示:

public async Task Perform(Func<Task> perform, CancellationToken cancellationToken)
{
  cancellationToken.ThrowIfCancellationRequested();
  using (await _AwaitableConstraint.WaitForReadiness(cancellationToken))
  {
    await perform();
  }
}

这两种方法应该就是你所需要的。