Асинхронное выполнение (fooAsyncPolicy.ExecuteAsync(...)
) ожидание с Task.Delay(...)
, освобождение потока, использованного вызывающей стороной, в то время как происходит задержка.
Синхронное выполнение (fooSyncPolicy.Execute(...)
)ожидание между попытками отменяемым способом блокировки потока .Это означает, что для синхронного (а):
action();
по сравнению с синхронным (б):
policy.Execute(action);
выполняются следующие три вещи:
- оба (a) и (b) блокируют продолжение выполнения (последующий код не запускается) до завершения инструкции;
- (b) выполняет
action
в том же потоке, что (a) первоначально - (b) выражает исключения (если операция с политикой не вмешивается) таким же / аналогичным возможному образом, как (a) первоначально имело бы.
Этисемантика (1) (2) (3) является преднамеренной, чтобы синхронно выполнять код с Полли так же схожи по семантике / поведению (окружающий код требует небольшой корректировки), как и выполнение кода без Полли.
Предвидениедополнительный вопрос: не было бы возможно написать синхронную Polly: Policy.Handle<T>().WaitAndRetry(...).Execute(action)
, чтобы она не блокировала поток во время ожидания перед повторной попыткой ?: Да, но не было найдено решение, которое было бы предпочтительным, чтобы позволить вызывающей сторонеконтрольпереход к TPL Task
s или async
/ await
с последующим использованием Polly's ExecuteAsync(...)
.