gpt4 book ai didi

c# - 异步任务的有效速率限制(每个时间间隔执行 N 次)

转载 作者:行者123 更新时间:2023-11-30 12:29:26 25 4
gpt4 key购买 nike

在使用 .Net 4.0/4.5 任务时,如何实现有效的速率限制算法(每个时间间隔执行 N 次特定操作)?例如,我希望 SendMessageAsync 在一秒钟内发送超过 N 条消息时阻止(不发送另一条消息)。

        await Task.WhenAll(
Enumerable.Range(0, TOTAL_MESSAGES)
.Select(async x =>
{
await clientSession.SendMessageAsync(CreateMessage());
}));

我尝试在 SendMessageAsync 中使用 Task.Delay 但由于等待 Task.Delay 立即返回,因此将发送下一条消息没有任何阻塞。

public async Task<ResponseMessage> SendMessageAsync(RequestMessage message)
{

int sleepTime;
if (throttler.ShouldThrottle(out sleepTime))
{
await Task.Delay(sleepTime);
}

return await InternalMessageWithoutWaitingAsync(message);
}

我可以将 await Task.Delay(sleepTime) 更改为 Thread.Sleep(sleepTime) 从而在异步之前等待,但我想知道这是否是使用时的好习惯任务。

最佳答案

async 代码中使用 Thread.Sleep 不是一个好习惯。

你可能会像这样得到你需要的东西:

private SemaphoreSlim _semaphore = new SemaphoreSlim(N);
public async Task<ResponseMessage> SendMessageAsync(RequestMessage message)
{
await _semaphore.WaitAsync();
try
{
return await InternalMessageWithoutWaitingAsync(message);
}
finally
{
ReleaseSemaphoreAfterDelayAsync();
}
}

private async Task ReleaseSemaphoreAfterDelayAsync()
{
await Task.Delay(TimeInterval);
_semaphore.Release();
}

关于c# - 异步任务的有效速率限制(每个时间间隔执行 N 次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18558121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com