具有悲观超时策略的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();