c# – 具有动态maxCount的SemaphoreSlim
发布时间:2020-12-16 00:11:13 所属栏目:百科 来源:网络整理
导读:我遇到了一个问题,我需要限制对另一个Web服务器的调用次数.它会有所不同,因为服务器是共享的,也许它可能有更多或更少的容量. 我在考虑使用SemaphoreSlim类,但是没有公共属性来更改最大计数. 我应该将我的SemaphoreSlim类包装在另一个将处理最大计数的类中吗
我遇到了一个问题,我需要限制对另一个Web服务器的调用次数.它会有所不同,因为服务器是共享的,也许它可能有更多或更少的容量.
我在考虑使用SemaphoreSlim类,但是没有公共属性来更改最大计数. 我应该将我的SemaphoreSlim类包装在另一个将处理最大计数的类中吗?有没有更好的方法? 编辑: 这是我正在尝试的: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Semaphore { class Program { static SemaphoreSlim _sem = new SemaphoreSlim(10,10000); static void Main(string[] args) { int max = 15; for (int i = 1; i <= 50; i++) { new Thread(Enter).Start(new int[] { i,max}); } Console.ReadLine(); max = 11; for (int i = 1; i <= 50; i++) { new Thread(Enter).Start(new int[] { i,max }); } } static void Enter(object param) { int[] arr = (int[])param; int id = arr[0]; int max = arr[1]; try { Console.WriteLine(_sem.CurrentCount); if (_sem.CurrentCount <= max) _sem.Release(1); else { _sem.Wait(1000); Console.WriteLine(id + " wants to enter"); Thread.Sleep((1000 * id) / 2); // can be here at Console.WriteLine(id + " is in!"); // Only three threads } } catch(Exception ex) { Console.WriteLine("opps ",id); Console.WriteLine(ex.Message); } finally { _sem.Release(); } } } } 问题: 1-_sem.Wait(1000)应该取消执行超过1000ms的线程,不是吗? 2 – 我是否有使用发布/等待的想法? 解决方法
您无法更改最大计数,但您可以创建具有非常高的最大计数的SemaphoreSlim,并保留其中一些.见
this constructor.
所以我们假设绝对最大并发调用数是100,但最初你希望它是25.你初始化你的信号量: SemaphoreSlim sem = new SemaphoreSlim(25,100); 因此25是可以同时服务的请求数.你保留了其他75. 如果您想增加允许的数量,只需调用Release(num).如果您调用了Release(10),那么该数字将变为35. 现在,如果要减少可用请求的数量,则必须多次调用WaitOne.例如,如果要从可用计数中删除10: for (var i = 0; i < 10; ++i) { sem.WaitOne(); } 这有可能阻塞,直到其他客户端释放信号量.也就是说,如果您允许35个并发请求,并且您希望将其减少到25,但是已经有35个客户端具有活动请求,那么WaitOne将阻塞,直到客户端调用Release,并且循环将不会终止,直到10个客户端发布. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |