目录
背景
间隔帮助类
使用帮助类
检查!!!
- 下载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()测试方法中查找用法代码。