在 C# 中,我正在调用一个公共 API,该 API 的 API 限制为每秒 10 次调用 [关闭]

2023-12-26

在 C# 中,我正在调用公共 API,该 API 的 API 限制为每秒 10 次调用。 API有多种方法,不同的用户可以调用不同的方法 一次,因此有可能出现“已达到速率限制”异常。

我有以下类结构:

public class MyServiceManager
{
    public int Method1()
    {
    }

    public void Method2()
    {
    }

    public string Method3()
    {
    }
}

多个用户可以一次调用不同的方法,我如何维护静态调用队列或 任务使我可以监控所有请求并在一秒钟内仅处理 10 个请求


您可以基于以下内容构建一个 TaskLimiterSemaphoreSlim https://msdn.microsoft.com/library/system.threading.semaphoreslim(v=vs.110).aspx

public class TaskLimiter
{
    private readonly TimeSpan _timespan;
    private readonly SemaphoreSlim _semaphore;

    public TaskLimiter(int count, TimeSpan timespan)
    {
        _semaphore = new SemaphoreSlim(count, count);
        _timespan = timespan;
    }

    public async Task LimitAsync(Func<Task> taskFactory)
    {
        await _semaphore.WaitAsync().ConfigureAwait(false);
        var task = taskFactory();
        task.ContinueWith(async e =>
        {
            await Task.Delay(_timespan);
            _semaphore.Release(1);
        });
        await task;
    }

    public async Task<T> LimitAsync<T>(Func<Task<T>> taskFactory)
    {
        await _semaphore.WaitAsync().ConfigureAwait(false);
        var task = taskFactory();
        task.ContinueWith(async e =>
        {
            await Task.Delay(_timespan);
            _semaphore.Release(1);
        });
        return await task;
    }
}

It will

  • 等待信号量“槽”
  • 开始真正的任务
  • 当实际任务完成时,在给定的时间跨度后释放信号量槽

这是一个示例用法

public class Program
{
    public static void Main()
    {
        RunAsync().Wait();
    }

    public static async Task RunAsync()
    {
        var limiter = new TaskLimiter(10, TimeSpan.FromSeconds(1));

        // create 100 tasks 
        var tasks = Enumerable.Range(1, 100)
           .Select(e => limiter.LimitAsync(() => DoSomeActionAsync(e)));
        // wait unitl all 100 tasks are completed
        await Task.WhenAll(tasks).ConfigureAwait(false);
    }

    static readonly Random _rng = new Random();

    public static async Task DoSomeActionAsync(int i)
    {
        await Task.Delay(150 + _rng.Next(150)).ConfigureAwait(false);
        Console.WriteLine("Completed Action {0}", i);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中,我正在调用一个公共 API,该 API 的 API 限制为每秒 10 次调用 [关闭] 的相关文章

随机推荐

  • 如何在html文本中允许数字、退格、删除、左右方向键?

    我正在使用以下 JavaScript 代码 我认为该代码应该只允许在文本框中输入数字 退格键 删除键 向左箭头和向右箭头键 但它也允许使用字母表 我不知道为什么 function validateQty event var key wind
  • 有没有办法在 Xcode 7 上获取 iOS 7 模拟器

    我刚刚将 Xcode 更新到最新版本 7 0 7A220 但丢失了之前版本中的 iOS 7 模拟器 我仍然拥有 iOS 7 SDK 并且想知道是否有办法在最新版本的 Xcode 上使用它 而不是在我的 OS X 上安装另一个版本的 Xcod
  • Swift UINavigation 底线和阴影删除而不改变导航栏颜色

    我的场景 我正在尝试消除底线和阴影UINavigationBar using iOS 13 斯威夫特 5 在此 之前iOS 13 斯威夫特 5 我使用下面的代码来删除底线和阴影而不改变导航栏颜色 现在 它没有显示NavigationBar颜
  • SQLite ORDER BY 'yyyy-mm-dd' 格式的月份号

    我有一个表 其中有一列名为call date in the DATETIME format 在本栏中 我有以下格式的日期yyyy mm dd 我想要的是选择按列值字符串中的月份编号排序的行 有没有这样的 SQLite 函数可以做到这一点 我
  • Twitter Bootstrap 320andup 实施

    我正在使用创建一个网站推特引导程序 http twitter github com bootstrap 但我发现媒体查询不适用于 IE9 以下的任何浏览器 不幸的是我的目标浏览器 这认为我使用引导程序 用于响应式缩放网格 的全部原因非常无用
  • div 中的随机图像背景

    我有一个 容器 DIV 可以缩放以 100 适合窗口 我想将随机图像加载到 DIV 中 我有一个适用于 html 背景的工作脚本 但我无法让它在 DIV 上工作 有什么建议吗 这是原始脚本
  • 因子的默认(“自动”)排序是 R 规范的一部分吗?按字母顺序排列?所有平台都一样吗?

    有时我们可能会想导入一些数据x into R例如read table 然后使用修改其级别levels x V1 lt c 如果我们不使用 列最初会导入到因子中as is选项也不指定colClasses character 我们可以考虑在大型
  • 什么是哈希表和哈希图及其典型用例?

    我最近几次遇到这些术语 但我很困惑它们如何工作以及通常何时实施 嗯 这样想吧 如果您使用数组 一种简单的基于索引的数据结构 并用随机的东西填充它 那么当您用数据填充它时 查找特定条目将变得越来越昂贵 因为您基本上必须从一端朝向另一端 直到找
  • 在 C++ 中的 include 语句中使用(相对)路径作为快捷方式

    几天前我开始用 C 编码 我使用 Windows 作为编写代码的操作系统 我一直将所有 编写良好 的代码保存在一个位置 现在 我正在开发一个需要使用这些代码的项目 因此 我计划将我需要的那些文件作为头文件包含在我的项目中 但是 为了使我的项
  • 如何从 Angular 11 降级到 Angular 9?

    参考无法将 Angular 从版本 6 降级到版本 5 https stackoverflow com questions 50268300 unable to downgrade angular from version 6 to 5 我
  • strlen 返回 size_t?

    In C 我的字符串长度函数返回一个size t value 为什么它不返回传统的整数 我注意到的另一件事是 当我尝试将此字符串与另一个字符串连接时 我在运行程序时收到了总线错误 上下文 我正在使用 gmp 库并将大数字转换为字符串 最终遇
  • HTTP 状态 404 描述 请求的资源 () 不可用。 Apache Tomcat/7.0.27 [重复]

    这个问题在这里已经有答案了 当我尝试访问我的项目主页时http localhost 7080 第一 http localhost 7080 first or http localhost 7080 first start page html
  • 对受 CPU 限制的算法/实现进行基准测试

    假设我正在写自己的StringBuilder使用编译语言 例如 C 衡量各种实施的性能的最佳方法是什么 简单地对几十万次运行进行计时会产生高度不一致的结果 一批与另一批的计时可能相差高达 15 因此无法准确评估潜在的性能改进 从而产生小于此
  • ScrollIntoView - 项目不应从视图中消失

    从一开始我就想说 我将向能够帮助我解决问题的人颁发 200 赏金 这是我的简单代码 带有 WPF 的 C namespace WpfApplication1
  • 在 C 中连接 char 数组:动态处理内存

    我对我在 C 程序中做错了什么感到困惑 我正在尝试创建一个以 a 开头的字符串 并添加从传感器读取的 6 个值 用逗号分隔 然后通过串行端口发送 示例输出如下 5 5 5 5 5 5 or 34 34 34 34 34 34 问题 因为传感
  • 每个线程一个 SQLiteConnection?

    我正在使用 system data sqlite org 中的 SQLite 我们需要从多个线程访问数据库 出于各种原因 我已经阅读了很多有关 sqlite 线程安全功能的内容 默认的同步访问模式对我来说很好 我想知道是否可以简单地为每个线
  • 如何使用 INSERT 语句的 OUTPUT 子句获取标识值?

    如果我有一个插入语句 例如 INSERT INTO MyTable Name Address PhoneNo VALUES Yatrix 1234 Address Stuff 1112223333 我该如何设置 var INT到新行的标识值
  • 具有多个值和一个键的 Powershell 哈希表

    我正在寻找一个数据结构 cmdlet 它允许我向 Powershell 中的单个键添加多个值 理想情况下 我的数据应如下所示 关键 价值观 主机名1 数据库1 数据库2 数据库3 主机名2 数据库1 数据库2 etc 我认为哈希表可以解决问
  • Button.isHighlighted 时如何更改边框颜色

    我想知道如何让我的边界围绕我UIButton单击或突出显示时更改其内部文本的不透明度 我的逻辑告诉我 它应该是这样的 但它似乎不起作用 BTN STYLING btnstd layer cornerRadius 5 btnstd layer
  • 在 C# 中,我正在调用一个公共 API,该 API 的 API 限制为每秒 10 次调用 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在 C 中 我正在调用公共 API 该 API 的 API 限制为每秒 10 次调用 API有多种方法 不同的用户可以调用不同的方法