如何在可观察的间隔中设置起始值

时间:2019-07-16 12:29:21

标签: signalr system.reactive rx.net

我正在尝试使用起始值创建订阅中心。我无法设置起始值。

现在我可以观察到,它每隔30分钟生成一次DateTime.UtcNow。

public async Task Subscribe()
{
    var client = Clients.Client(Context.ConnectionId);
    var subscription = new CompositeDisposable();
    var dateTimeUTCNow = Observable.Interval(TimeSpan.FromMinutes(30))
           .Subscribe(@event => 
           {
               client.SendAsync("newDateTimeUtc", DateTime.UtcNow);
           });

    subscription.Add(dateTimeUTCNow);
    RegisterHandler(subscription, userFound.UserToken);
}

我必须设置起始值-DateTime.NowUtc

2 个答案:

答案 0 :(得分:1)

您可以使用.Timer(TimeSpan dueTime, TimeSpan period)重载代替Interval运算符。 如果将dueTime设置为TimeSpan.Zero,它将在订阅时发出第一项。

Observable
    .Timer(TimeSpan.Zero, TimeSpan.FromMinutes(30))
    .Select(_ => DateTime.UtcNow)
    ...

作为gitbox mentioned,您也可以使用StartWith。但是StartWith将为您提供声明时间而不是订阅时间。如果声明时间和订阅时间相同,那么当然不会有差异。

答案 1 :(得分:0)

您是否正在寻找StartWith运算符?

Observable
    .Interval(TimeSpan.FromMinutes(30))
    .Select(_ => DateTime.UtcNow)
    .StartWith(DateTime.UtcNow)
    ...