- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个问题,我需要限制对另一个网络服务器的调用次数。它会有所不同,因为服务器是共享的,并且可能具有更多或更少的容量。
我正在考虑使用 SemaphoreSlim 类,但没有公共(public)属性可以更改最大计数。
我应该将我的 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) 应该取消将执行超过 1000 毫秒的线程的执行,不是吗?
2-我有没有使用 Release/Wait 的想法?
最佳答案
您不能更改最大计数,但您可以创建一个具有非常高的最大计数的 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 个客户端,循环才会终止。
关于c# - 具有动态 maxCount 的 SemaphoreSlim,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24067200/
我想知道是否SemaphoreSlim调用 Await 时具有优先级之类的东西。 我找不到任何东西,但也许以前有人做过这样的事情。 这个想法是,如果我需要,可以稍后以更高的优先级在信号量上调用等待,并
Documentation说: The SemaphoreSlim class represents a lightweight, fast semaphore that can be used fo
目前,我正在努力实现 SemaphoreSlim 以“锁定”必须是线程安全的方法的“部分”。我的问题是,在没有异常处理过载的情况下实现它是非常困难的。因为在释放“锁”之前抛出异常时,它将永远留在那里。
我创建了以下方法 TestThrottled 来尝试限制我的任务,但它根本没有限制,当我调用 WhenAll 并且此方法都具有相同的耗时时。我做错了什么吗? private static as
我们正在使用 .NET 4.5.1 开发一个应用程序,并在后台使用 SemaphoreSlim 实现了我自己的“异步锁”。要锁定,我们使用以下方法: public async Task LockAsy
semaphore 的真正力量是: Limits the number of threads that can access a resource or pool of resources concu
我在 .NET Core (2.2) 中使用 SemaphoreSlim 类时遇到问题,希望有人可以提供帮助。 我有一个 API 方法 (AddBooking),它将预订添加到数据库,此方法包括 3
概括 我有一个使用 lock 的类(class)提供对私有(private)字段的线程安全访问。但是,由于下面详述的原因,我正在考虑改用 SemaphoreSlim实现线程安全。我知道如果我用 loc
为了同步,我创建了一个 SemaphoreSlim(1)。 这意味着如果我在我的类中有这个信号量的单个实例作为锁: private SemaphoreSlim _initializationSemap
我正在尝试使用新的 SemaphoreSlim .NET 4.0 中的类来限制可以无限期运行的快节奏循环的速率。在对此进行单元测试时,我发现如果循环足够紧密且并行度足够高,SemaphoreSlim当
这个有效: int _counter; readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); async void Button_C
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp2 { clas
我对 await 关键字的理解是,await 限定语句之后的代码在完成后作为该语句的延续运行。 因此以下两个版本应该产生相同的输出: public static Task Run(Semaph
class Program { static IEnumerable list = Enumerable.Range(1, 10).Select(i => new site(i.ToStrin
我在 Async/Await 函数中有一部分代码,我希望一次只执行一个线程。 这相对简单,只需创建一个新的 SemaphoreSlim(1) 并使用 WaitAsync/Release。效果是第一个线
根据文档: "a SemaphoreSlim doesn't use a Windows kernel semaphore". SemaphoreSlim 是否使用了任何特殊资源,这使得在不再使用 S
SemaphoreSlim 的文档说“只有在所有其他操作都已完成时才应使用 Dispose”。 应该如何调整以下类,以便线程 B 可以在线程 A 等待 Async() 时调用 Dispose()。调用
附加问题 SemaphoreSlim(1, 1) 是否仍然确保我有正确的输出 1000000,即使 task1 和 task2 在 2 个不同的平台上运行核心? 原始问题 考虑以下代码片段,_sema
我最近开始学习 C#,但在更新 UI 时遇到了运行多线程的问题。根据我目前所学,SemaphoreSlim 似乎是运行多线程同时仍控制最大并发线程数的正确方法。 场景:我想向网站(例如http://w
我遇到了一个问题,我需要限制对另一个网络服务器的调用次数。它会有所不同,因为服务器是共享的,并且可能具有更多或更少的容量。 我正在考虑使用 SemaphoreSlim 类,但没有公共(public)属
我是一名优秀的程序员,十分优秀!