小编bas*_*ick的帖子

Observable.Timer():如何避免定时器漂移?

在C#(.NET 4.0)应用程序中,我使用Reactive Extensions(2.0.20823.0)生成时间边界,以将事件分组为聚合值.为了简化对结果数据库的查询,需要在整个小时(或下面示例中的秒)对齐这些边界.

使用Observable.Timer():

var time = DefaultScheduler.Instance;

var start = new DateTimeOffset(time.Now.DateTime, time.Now.Offset);

var span = TimeSpan.FromSeconds(1);

start -= TimeSpan.FromTicks(start.Ticks % 10000000);
start += span;

var boundary = Observable.Timer(start, span, time);

boundary.Select(i => start + TimeSpan.FromSeconds(i * span.TotalSeconds))
    .Subscribe(t => Console.WriteLine("ideal: " + t.ToString("HH:mm:ss.fff")));

boundary.Select(i => time.Now)
    .Subscribe(t => Console.WriteLine("actual: " + t.ToString("HH:mm:ss.fff")));
Run Code Online (Sandbox Code Playgroud)

您可以看到计时器的预期和实际时间相差很大:

ideal: 10:06:40.000
actual: 10:06:40.034
actual: 10:06:41.048
ideal: 10:06:41.000
actual: 10:06:42.055
ideal: 10:06:42.000
ideal: 10:06:43.000
actual: 10:06:43.067
actual: 10:06:44.081
ideal: 10:06:44.000
ideal: 10:06:45.000
actual: …
Run Code Online (Sandbox Code Playgroud)

.net c# system.reactive

15
推荐指数
2
解决办法
3741
查看次数

为什么Observable.Generate()抛出System.StackOverflowException?

我正在编写一个C#(.NET 4.5)应用程序,用于聚合基于时间的事件以进行报告.为了使我的查询逻辑可以重复用于实时和历史数据,我使用了Reactive Extensions(2.0)及其IScheduler基础结构(HistoricalScheduler和朋友).

例如,假设我们创建的事件列表(按时间顺序排序,但他们可能一致!),其唯一的有效载荷IST他们的时间戳,想知道他们的整个固定期限的缓冲区分配:

const int num = 100000;
const int dist = 10;

var events = new List<DateTimeOffset>();
var curr = DateTimeOffset.Now;
var gap = new Random();

var time = new HistoricalScheduler(curr);

for (int i = 0; i < num; i++)
{
    events.Add(curr);
    curr += TimeSpan.FromMilliseconds(gap.Next(dist));
}

var stream = Observable.Generate<int, DateTimeOffset>(
    0,
    s => s < events.Count,
    s => s + 1,
    s => events[s],
    s => events[s],
    time);

stream.Buffer(TimeSpan.FromMilliseconds(num), time)
    .Subscribe(l => Console.WriteLine(time.Now …
Run Code Online (Sandbox Code Playgroud)

.net c# scheduler system.reactive

9
推荐指数
1
解决办法
756
查看次数

标签 统计

.net ×2

c# ×2

system.reactive ×2

scheduler ×1