具有悲观超时策略的C#Polly在多个线程上运行缓慢?

具有悲观超时策略的C#Polly在多个线程上运行缓慢?,c#,multithreading,performance,timeout,polly,C#,Multithreading,Performance,Timeout,Polly,考虑这段代码: using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Polly; using Polly.Timeout; namespace Test { public class Program { public static async Task Main() {

考虑这段代码:

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Polly;
using Polly.Timeout;

namespace Test
{
    public class Program
    {
        public static async Task Main()
        {
            var tasks = new List<Task>();

            for (var i = 0; i < 20; i++)
            {
                var task = new Task(Test);
                tasks.Add(task);
            }

            foreach (var task in tasks)
                task.Start();

            await Task.WhenAll(tasks);
        }

        public static void Test()
        {
            Console.WriteLine($"Executing Test() at {DateTime.Now}");

            Policy.Timeout(TimeSpan.FromSeconds(2), TimeoutStrategy.Pessimistic)
                .Execute(() => { Thread.Sleep(200); });
        }
    }
}
最后抛出Polly.Timeout.TimeoutRejectedException。 我真的不明白为什么要花这么长时间才能执行?从输出来看,前8个任务似乎是并行执行的,然后速度变得非常慢。 没有超时策略或乐观超时策略,它会立即运行。但在我的例子中,只能使用悲观超时策略


使用最新的Polly版本,即6.0.1。

我认为将任务添加到列表中然后启动它们的方式并不完全正确

有关正确使用.Start()的说明,请参见此答案()

因此,在您的情况下,您真正需要做的就是更改添加部分

for (var i = 0; i < 20; i++)
{
   tlist.Add(Task.Run(() => Test()));
}

你想解决什么样的问题?为什么需要这个?这只是超时策略的基本用例。我试图在数据库调用上设置一个特定的超时,但遇到了这个问题。我发布了一个简单的例子来说明这个问题
Main
的开头是否会产生影响?你认为这是为什么?对db的调用(在现实生活中)是同步的并且阻塞线程吗?(就像问题代码中的Thread.Sleep那样)。在db调用为异步的情况下,模拟需要使用
策略.TimeoutAsync
任务.Delay
(代替
线程.Sleep
)来模拟对db的异步调用。(在同步情况下,与线程池的使用和行为相关的其他答案/注释+1。)@Mountaintraveler否,db调用是同步的。
for (var i = 0; i < 20; i++)
{
   tlist.Add(Task.Run(() => Test()));
}
foreach (var task in tasks)
            task.Start();