Какой механизм ожидания использует Полли - PullRequest
0 голосов
/ 12 февраля 2019

Polly имеет несколько функций повтора, как, например, WaitAndRetryForever.Я посмотрел в документации, но не смог найти, что именно используется для того, чтобы заставить поток ждать до следующей попытки.Я думаю, Polly использует System.Timers для этого или это что-то совершенно другое?Спасибо за сотрудничество.

1 Ответ

0 голосов
/ 12 февраля 2019

Асинхронное выполнение (fooAsyncPolicy.ExecuteAsync(...)) ожидание с Task.Delay(...), освобождение потока, использованного вызывающей стороной, в то время как происходит задержка.


Синхронное выполнение (fooSyncPolicy.Execute(...))ожидание между попытками отменяемым способом блокировки потока .Это означает, что для синхронного (а):

action();

по сравнению с синхронным (б):

policy.Execute(action);

выполняются следующие три вещи:

  1. оба (a) и (b) блокируют продолжение выполнения (последующий код не запускается) до завершения инструкции;
  2. (b) выполняет action в том же потоке, что (a) первоначально
  3. (b) выражает исключения (если операция с политикой не вмешивается) таким же / аналогичным возможному образом, как (a) первоначально имело бы.

Этисемантика (1) (2) (3) является преднамеренной, чтобы синхронно выполнять код с Полли так же схожи по семантике / поведению (окружающий код требует небольшой корректировки), как и выполнение кода без Полли.


Предвидениедополнительный вопрос: не было бы возможно написать синхронную Polly: Policy.Handle<T>().WaitAndRetry(...).Execute(action), чтобы она не блокировала поток во время ожидания перед повторной попыткой ?: Да, но не было найдено решение, которое было бы предпочтительным, чтобы позволить вызывающей сторонеконтрольпереход к TPL Task s или async / await с последующим использованием Polly's ExecuteAsync(...).

...