Повторяющаяся работа не вызывается в установленное время - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть повторяющаяся работа, которая вызывается при запуске. Он должен вызывать PlaceOrder () каждые 20 секунд.

Задание выглядит следующим образом

 RecurringJob.AddOrUpdate<MethodCaller>(a => a.PlaceOrder(), "*/20 * * * * *"); 

Метод PlaceOrder () вызывает RevokeOrder () с задержкой в ​​5 секунд.

Методы

    public void PlaceOrder()
    {
        DateTimeOffset d = DateTimeOffset.Now;

        Debug.WriteLine("PLACED : {0}", d);
        Task.Delay(5000).ContinueWith(t => RevokeOrder());
    }

    public void RevokeOrder()
    {
        DateTimeOffset d = DateTimeOffset.Now;

        Debug.WriteLine("REVOKED : {0}",d);
    }

Проблема заключается в том, что оба метода вызываются каждые 15 секунд или иногда каждые 30 секунд вместо 20.

Журналы:

PLACED : 1:59:27 
 REVOKED : 1:59:32 
PLACED : 1:59:42 
 REVOKED : 1:59:47 
PLACED : 2:00:12 
 REVOKED : 2:00:17 
PLACED : 2:00:27 
 REVOKED : 2:00:32 
PLACED : 2:00:43 
 REVOKED : 2:00:48 

Я хочу, чтобы методы PlaceOrder () и RevokeOrder () вызывались каждые 20 секунд. Но между ними должна быть задержка в 5 секунд. Как мне это исправить?

1 Ответ

1 голос
/ 01 апреля 2020

См. Ниже работающее консольное приложение, которое решает проблему. Использует таймер вместо recurringJob.

class Program
    {
        static void Main(string[] args)
        {
            var startTimeSpan = TimeSpan.Zero;
            var periodTimeSpan = TimeSpan.FromSeconds(20);

            var timer = new System.Threading.Timer(async (e) =>
            {
                await PlaceOrderAsync();
            }, null, startTimeSpan, periodTimeSpan);
            Console.ReadLine();
        }

        private static async Task PlaceOrderAsync()
        {
            DateTimeOffset d = DateTimeOffset.Now;

            Console.WriteLine("PLACED : {0}", d);
            await Task.Delay(5000).ContinueWith(t => RevokeOrder());
        }

        public static void RevokeOrder()
        {
            DateTimeOffset d = DateTimeOffset.Now;

            Console.WriteLine("REVOKED : {0}", d);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...