каждую минуту вызывается какой-то метод C # (asp.net web api web) - PullRequest
0 голосов
/ 15 января 2019

Мне нужно запускать метод C # каждую минуту. Я создал observable для таймера и вызывал его каждые 1 минуту, и этот код я использую в конструкторе классов. Есть ли другое решение?

public Test()
{
    IObservable<long> timer = Observable
        .Defer(() =>
    {
        var now = DateTimeOffset.Now;
        var result = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, 0, 0, now.Offset);
        result = result.AddMinutes(((now.Minute / 1) + 1) * 1);
        return Observable.Timer(result, TimeSpan.FromMinutes(1.0));
    });

    timer.Subscribe(async x =>
    {
        await InvokeMethod().ConfigureAwait(false);
    });
}

1 Ответ

0 голосов
/ 15 января 2019

Мне кажется, это то, что вам нужно:

public void Test()
{
    IObservable<Unit> timer =
        Observable
            .Defer(() =>
            {
                var now = DateTimeOffset.Now;
                var result = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute + 1, 0, now.Offset);
                return Observable.Timer(result, TimeSpan.FromMinutes(1.0));
            })
            .SelectMany(x => Observable.FromAsync(() => InvokeMethod()));

    timer.Subscribe();
}

Имейте в виду, что это будет дрейфовать со временем и не будет срабатывать каждую минуту. Вам нужно каждый раз перестраивать. Использование Observable.Generate было бы лучше.


public void Test()
{
    IObservable<Unit> timer =
        Observable
            .Generate(
                new { now = DateTimeOffset.Now, count = 0 },
                t => true,
                t => new { t.now, count = t.count + 1 },
                t => t.count,
                t => t.now.AddMinutes(t.count))
            .SelectMany(x => Observable.FromAsync(() => InvokeMethod()));

    timer.Subscribe();
}
...