Teaser :伙计们,这个问题不是关于如何实施重试策略的。 这是关于正确完成TPL数据stream块。 这个问题主要是我以前的问题在ITargetBlock内重试策略的延续 。 这个问题的答案是@ svick利用TransformBlock (source)和TransformManyBlock (target)的智能解决scheme。 剩下的唯一问题就是以正确的方式完成这个块:等待所有的重试先完成,然后完成目标块。 这就是我最终的结果(这只是一个片段,不要太注意非线程安全的retries集): var retries = new HashSet<RetryingMessage<TInput>>(); TransformManyBlock<RetryableMessage<TInput>, TOutput> target = null; target = new TransformManyBlock<RetryableMessage<TInput>, TOutput>( async message => { try { var result = new[] { await transform(message.Data) }; retries.Remove(message); return result; } catch (Exception ex) { message.Exceptions.Add(ex); if (message.RetriesRemaining == 0) { if […]
我想运行一堆asynchronous任务,限制在任何给定时间有多less任务可能正在等待完成。 假设您有1000个url,并且您只希望一次打开50个请求; 但只要一个请求完成,您就可以打开到列表中下一个URL的连接。 那样的话,一次只能打开50个连接,直到URL列表被耗尽。 如果可能的话,我也想利用给定数量的线程。 我想出了一个扩展方法, ThrottleTasksAsync ,做我想要的。 那里有一个更简单的解决scheme吗? 我会假设这是一个常见的情况。 用法: class Program { static void Main(string[] args) { Enumerable.Range(1, 10).ThrottleTasksAsync(5, 2, async i => { Console.WriteLine(i); return i; }).Wait(); Console.WriteLine("Press a key to exit…"); Console.ReadKey(true); } } 这里是代码: static class IEnumerableExtensions { public static async Task<Result_T[]> ThrottleTasksAsync<Enumerable_T, Result_T>(this IEnumerable<Enumerable_T> enumerable, int maxConcurrentTasks, int maxDegreeOfParallelism, […]