您当前的位置: 首页 > 

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C#:Interval Helper

寒冰屋 发布时间:2019-09-01 12:32:17 ,浏览量:1

目录

背景

间隔帮助类

使用帮助类

检查!!!

  • 下载Visual Studio 2017解决方案,包括测试代码 - 4.7 KB
背景

我从C#调用私有API,每个用户的API限制为每秒2次调用。因此,如果在一秒钟内调用API超过两次,则有可能获得“速率限制达到异常”。这就是为什么在进行API调用之前,我们必须确保两个调用start之间的时间间隔至少为500毫秒。

我们不只是在进行API调用。每次调用后,我们都要处理其他一些事情。为了使事情易于管理,我们使用了一个简单的间隔帮助类,它为我们提供了预期的等待时间。之后等待时间已经过去Thread.Sleep(),就是这样。让我们检查时间间隔帮助类及其用法。

间隔帮助类

这是接口:

public interface IIntervalHelper
{
    /// 
    /// Expected Interval
    /// 
    TInterval Interval();

    /// 
    /// Process start time, assigned at Begin method
    /// 
    DateTime StartDateTime();

    /// 
    /// Set interval
    /// 
    /// Time
    void SetInterval(TInterval interval);

    /// 
    /// Start process time count, will set startDateTime
    /// 
    /// Default DateTime.Now
    void Begain(DateTime? startDateTime = null);

    /// 
    /// Get passed time
    /// 
    /// Should be greater than startDateTime, 
    /// Default DateTime.Now
    /// Time
    TInterval PassedTime(DateTime? endDateTime = null);

    /// 
    /// Get remaining time
    /// 
    /// Should be greater than startDateTime, 
    /// Default DateTime.Now
    /// Time
    TInterval RemainingTime(DateTime? endDateTime = null);
}

使用接口创建主帮助类:

/// 
/// TimeSpan interval helper class
/// 
public class TimeSpanIntervalHelper : IIntervalHelper
{
    private TimeSpan _interval;
    private DateTime _startDateTime;

    public TimeSpanIntervalHelper(TimeSpan interval)
    {
        SetInterval(interval);
    }

    public TimeSpan Interval()
    {
        return _interval;
    }

    public DateTime StartDateTime()
    {
        return _startDateTime;
    }

    public void SetInterval(TimeSpan interval)
    {
        _interval = interval;
    }

    public void Begain(DateTime? startDateTime = null)
    {
        _startDateTime = startDateTime ?? DateTime.Now;
    }

    public TimeSpan PassedTime(DateTime? endDateTime = null)
    {
        DateTime dateTime = endDateTime ?? DateTime.Now;
        if (dateTime < _startDateTime)
        {
            throw new ArgumentException("EndDateTime should n't be less then StartDateTime");
        }
        TimeSpan difference = dateTime - _startDateTime;
        return difference;
    }

    public TimeSpan RemainingTime(DateTime? endDateTime = null)
    {
        DateTime dateTime = endDateTime ?? DateTime.Now;
        TimeSpan passedTime = PassedTime(dateTime);
        TimeSpan remainingTime = _interval - passedTime;
        return remainingTime;
    }
}
使用帮助类

在这里,我们将间隔设置为500毫秒。

TimeSpan interval = new TimeSpan(0, 0, 0, 0, 500);
var intervalHelper = new TimeSpanIntervalHelper(interval);

for (int i = 0; i < 10; i++)
{
    intervalHelper.Begain();

    /*
     * doing jobs or calling web api as needed for each item
     */

    /*at end of each process*/
    DateTime endDateTime = DateTime.Now;
    TimeSpan value = intervalHelper.PassedTime(endDateTime);
    value = intervalHelper.RemainingTime(endDateTime);

    /*we can also do
    value = intervalHelper.PassedTime();
    value = intervalHelper.RemainingTime();
    */

    /*wait and do job again*/
    Thread.Sleep(value);
}

有关更多信息,请检查TimeSpan_Use()测试方法。

检查!!!

在源代码中,我们将找到另一个帮助类IntervalHelper,它只在毫秒内管理事物。用法与TimeSpanIntervalHelper相同。在MilliSecond_Use()测试方法中查找用法代码。

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0460s