我有这种方法:
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();
}
}
如何更改签名以接受包含任何参数的任何方法,并等待它?
答案 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语句时所做的。
那么这是如何回答你的问题的呢?好吧,假设我们只对传递返回Task
或Task<T>
到Perform
的方法感兴趣,则需要两种方法:每种方法一种。您已经拥有Task<T>
的功能。 Task
的功能如下所示:
public async Task Perform(Func<Task> perform, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
using (await _AwaitableConstraint.WaitForReadiness(cancellationToken))
{
await perform();
}
}
这两种方法应该就是你所需要的。