【发布时间】:2012-01-16 22:53:55
【问题描述】:
我有应该是“QoSed”的 dll 方法——这个方法每秒最多应该被调用 100 次。:
private static extern int ExecTrans(int connectionId);
这个方法只用在程序中的一个地方,所以qos这个地方是可以的。
我需要为每个connectionId 提供单独的“qos 计数器”。所以ExecTrans(1) 和ExecTrans(2) 应该去不同的柜台。
在第一次迭代时,我想计算调用方法的频率(对于每个 connectionId)。 IE。我想要“实时统计”。有两种方法:
- allow to exceed limitiation for a short period. for example allow "100 transaction from 0 to 1 second, 100 transaction from 1 to 2 seconds and 200 transactions from 0.5 to 1.5 second".
- at any second interval transactions should not exceed 100.
现在我不在乎使用哪种方法,但我会选择一种减少“开销”的方法。我希望 qos 添加尽可能少的“额外工作”,因为它是对每 0.1 毫秒敏感的交易软件。
至于第一种方法,我想我可以使用类似的东西(伪代码,可能 stats 和 curStats 应该是线程安全的):
private int[] stats // statistic to display to user
private int[] curStats; // statistic currently collection
OnOneSecondElapsed(object source, ElapsedEventArgs args) {
foreach (conId : connIds) {
stats[conId] = curStats[conId];
curStats[conId] = 0;
}
}
myMethod {
......
ExecTrans(conId);
++curStats[conId];
......
}
至于第二种方法....是否可以创建一个集合,其中对象的生命恰好是一秒钟,一秒钟后消失?然后每次我都会将下一个对象添加到集合中,除非集合包含 100 个对象。
你怎么看?我不熟悉 C# 库文件,所以可能我缺少一些有用的类,也许你可以建议另一种方法。
【问题讨论】:
标签: c#