0

我定义了以下Polly政策:

sharedBulkhead = Policy.Bulkhead(maxParallelizations, maxQueuingActions);
resilienceStrategy = Policy.Wrap(retryPolicy, circuitBreaker, sharedBulkhead);
policyWrap = fallbackForAnyException.Wrap(fallbackForCircuitBreaker.Wrap(resilienceStrategy));

我像这样执行策略:

public bool Notify(IGrouping<string, TModel> messages)
    {
        var endPoint = messages.Key;
        Task.Run(() =>
        {
            foreach (var message in messages)
            {
                policyWrap.Execute((context) => CallApi(endPoint), new Context(endPoint));
            }
        });

        return true;
    }

我希望每个调用Notify()都在一个新线程上运行。所以,我的问题是:我是否必须显式调用Task.Run(() =>一个新线程,还是由 polly 自动在一个新线程上运行?

4

1 回答 1

0

我希望对 Notify() 的每次调用都在新线程上运行。所以,我的问题是:[...] polly 会自动在新线程上运行吗?

不,正如Polly 舱壁 wiki 页面所说:

策略本身不会调用线程;它假设上游系统已经将调用放入线程,但限制了它们的并行执行

Polly中没有任务调度的概念(使用 a TaskScheduler)(为了完整起见,在同步悲观 TimeoutPolicy 的非常特殊的情况下除外)。

然而,为了完整起见,所有Polly 策略都是线程安全的。

于 2018-12-17T20:28:06.677 回答