考虑这段代码:
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); });
}
}
}
我得到以下输出:
Executing Test() at 2018-05-16 15:10:21
Executing Test() at 2018-05-16 15:10:21
Executing Test() at 2018-05-16 15:10:21
Executing Test() at 2018-05-16 15:10:21
Executing Test() at 2018-05-16 15:10:21
Executing Test() at 2018-05-16 15:10:21
Executing Test() at 2018-05-16 15:10:21
Executing Test() at 2018-05-16 15:10:21
Executing Test() at 2018-05-16 15:10:22
Executing Test() at 2018-05-16 15:10:23
Executing Test() at 2018-05-16 15:10:24
Executing Test() at 2018-05-16 15:10:24
Executing Test() at 2018-05-16 15:10:24
Executing Test() at 2018-05-16 15:10:25
Executing Test() at 2018-05-16 15:10:26
Executing Test() at 2018-05-16 15:10:26
Executing Test() at 2018-05-16 15:10:27
Executing Test() at 2018-05-16 15:10:27
Executing Test() at 2018-05-16 15:10:27
Executing Test() at 2018-05-16 15:10:28
最后扔了一个Polly.Timeout.TimeoutRejectedException
。 我真的不明白为什么执行需要这么长时间?从输出来看,前 8 个任务似乎并行执行,然后变得非常慢。
没有超时策略或乐观的超时策略,它会立即运行。但就我而言,只能使用悲观的超时策略。
使用最新的 Polly 版本,即 6.0.1。
我认为您将任务添加到列表中然后启动它们的方式并不完全正确。
请参阅此答案(关于 Task.Start(( 、Task.Run(( 和 Task.Factory.StartNew((( 的使用,以澄清正确使用 。开始((。
因此,在您的情况下,您真正需要做的就是将"添加"部分更改为此部分
for (var i = 0; i < 20; i++)
{
tlist.Add(Task.Run(() => Test()));
}
这将解决您的问题,并且可能您不需要波莉。但是您应该注意任务列表的大小。您将使用 .net 线程池,因此您不会像以前那样使用物理线程,但仍然是您可以推动多远的限制。
编辑:
您还需要在此处摆脱此部分
foreach (var task in tasks)
task.Start();