2016-10-12 3 views
4

Observable.Interval производит значение каждый период времени. Как заставить его ждать, пока действие не закончится до следующей итерации?Observable.Interval Подождите, пока действие не будет выполнено.

Пример:

Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(async t => 
{ 
    //Here could be some long running action with different duration each iteration 
    Console.WriteLine(t.ToString()); 
    await Task.Delay(3000); 
}); 

Он начнет Действие каждую секунду. Как заставить его ждать завершения действия?

ответ

-1

Почему бы не реализовать его самостоятельно? Используйте TaskFactory.StartNew в цикле или рекурсивном методе while. Затем имитировать работу с помощью Task.Delay

+0

На самом деле я хочу избежать использования методов while или recursive. –

+0

Вы можете сделать что-то подобное, что знаете. Но без передачи временного интервала вы можете реализовать что-то, требующее действий, и то, что вы делаете, - это действие, сделать его задачей, и когда эта задача завершится, снова вызовите действие. Отметьте это сообщение: http://stackoverflow.com/questions/13695499/proper-way-to-implement-a-never-ending-task-timers-vs-task –

2

То, что вы просите за это поведение по умолчанию - если вы не вводить async/await - поэтому удалите async и использовать Task.Delay(3000).Wait() вместо этого.

Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(t => 
{ 
    //Here could be some long running action with different duration each iteration 
    Console.WriteLine(t.ToString()); 
    Task.Delay(3000).Wait(); 
}); 

Контракт на наблюдаемом будет производить только новое значение после того, как наблюдатели сделали - если вы не вводить async.

Observable.Interval(TimeSpan.FromSeconds(1)) не производит значения каждую секунду - он производит интервал одной секунды между наблюдателя (ов) и заканчивая следующий стартовый.

Итак, если у вас есть длинный наблюдатель, у вас все равно будет полная секунда между одним финишем и следующим запуском.

+0

Извините, но он не работает должным образом ' code' Observable.Interval (TimeSpan.FromSeconds (1)). Подписаться (t => { // Здесь может быть какое-то продолжительное действие с разной продолжительностью каждой итерации Console.WriteLine («Before» + DateTime.Now. ToLongTimeString(). ToString()); Task.Delay (3000) .Wait(); Console.WriteLine («После» + DateTime.Now.ToLongTimeString(). ToString()); }); 'code' Последний« После »со следующим« До »не имеет интервала в 1 секунду. –

+0

Извините, но он не работает как ожидалось. 'Observable.Interval (TimeSpan.FromSeconds (1)). Подписаться (t => { Консоль.WriteLine (" Before "+ DateTime.Now.ToLongTimeString(). ToString()); Task.Delay (3000) .Wait(); Console.WriteLine ("После" + DateTime.Now.ToLongTimeString() ToString());. }); ' Last "После того, как" с следующий «До» не имеет интервала в 1 секунду. –