受控的并行任务执行使用什么
我正在通过某些对象运行并行任务,以使其更快地并行运行4. 现在有一个新的要求,我需要执行一个任务,该任务必须一次执行一个,而其他任务必须等待(其他人不能执行另一个任务). 我无法同步测试. 请检查图像以更好的解释. 一次执行一个,但是我想使用信号量在开始和结尾处等待4个对象. 问题在于,信号量并没有等待所有人完成以便离开另一个. 当所有4个完成时,它才必须启动并留下此执行. 我应该用什么? 解决方案 使用A Barrier对象,参与数为4.这是一个示例: var barrier = new Barrier(4); 然后在您的任务方法中: //do some work //now, wait barrier.SignalAndWait(); 所有方法都将等到所有参与者都打电话SignalAndWait(),然后他们将继续.
26 2024-04-26
编程技术问答社区
Semaphoreslim异步任务问题
我一直在尝试使用信号量来限制我一次运行的并发任务数量,但似乎没有效果,这可能归结为我的实现,这就是为什么我在这里.我的信号量代码就像: 首先是由 称为 await Task.Run(() => mc.StartAsync()); 调用此方法 public async Task StartAsync() { using (SemaphoreSlim concurrencySemaphore = new SemaphoreSlim(5)) { foreach (var task in ThreadHandler.ThreadList) { await concurrencySemaphore.WaitAsync(); try { await Task.Run(() => task.Operation.Start());
16 2024-04-26
编程技术问答社区
使用 Task.WhenAny 等待 SemaphoreSlim 的容量
我有一个异步处理管道.我正在实施一个约束,因此我需要将提交数量限制为下一阶段.对于我的组件,我有: 单个输入源(项目用源ID标记) 我需要以向旋转方式传播输入的一个目的地 如果能力可用于多个客户端,我会为每个客户转发一条消息(即,如果我醒来,因为客户端3的信号量最终已可用,我可能会首先向客户2,然后3等发送一条消息) 因此,处理循环正在等待以下一个或多个条件继续处理: 更多的输入已经到了(可能是针对不在极限的客户) 已经为客户发布了能力,我们正在持有 的数据 理想情况下,我因此将Task.WhenAny与 一起使用 代表输入的任务c.Reader.WaitToReadAsync(ct).AsTask() n代表我们持有数据的客户端的任务,但对提交尚未有效(SemaphoreSlim的Wait将失败) 信号量的AvailableWaitHandle是理想的 - 我想知道它何时可用,但我还不想保留它,因为我有一系列的处理 - 我只想知道是否是否
16 2024-04-26
编程技术问答社区
C# Semaphores不能按预期工作,无法找出原因
我正在C#中构建ASP.NET(.NET Framework)应用程序,我正在向称为" LinuxDocker"的后端服务进行API呼叫,并且我正在尝试限制从ASP.NET的12个并发电话的数量应用.这是我写的代码: private static Semaphore LinuxDockerSemaphore = new Semaphore(12, 12); public static SemaphoreWaiter WaitForLinuxDocker(int timeoutMS = -1) { return new SemaphoreWaiter(LinuxDockerSemaphore, timeoutMS); } public class SemaphoreWaiter : IDisposable { Semaphore Slim; public SemaphoreWaiter(Semaphore slim, int timeoutMS =
22 2024-04-26
编程技术问答社区
在Windows 7上无法以标准用户身份创建信号灯
我不知道这是设计是否是设计,但是我似乎无法在Windows 7上创建一个新的信号量作为标准用户,也不能在此方面创建电源用户. SemaphoreSecurity semSec = new SemaphoreSecurity(); // have also tried "Power Users", "Everyone", etc. SemaphoreAccessRule rule = new SemaphoreAccessRule("Users", SemaphoreRights.FullControl, AccessControlType.Allow); semSec.AddAccessRule(rule); bool createdNew = false; // throws exception sem = new Semaphore(1, 1, SEMAPHORE_ID, out createdNew, semSec); return true;
16 2024-04-25
编程技术问答社区
SemaphoreSlim 和 async/await
这有效: int _counter; readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); async void Button_Click(object sender, RoutedEventArgs e) { if (_semaphore.Wait(0)) { Title = $"{ ++_counter}"; await Task.Delay(1000); // simulate work Title = $"{ --_counter}"; _semaphore.Release(); } } 第一次单击后,忽略了更多按钮,直到完成工作为止. Tittle可以是1或0. 这不起作用 void Button_Click(object sender, RoutedEventArgs e) { if (_s
24 2024-04-25
编程技术问答社区
如何限制数据库的异步IO任务的数量?
我有一个id's的列表,我想从数据库并行获取每个id的数据.我的下面ExecuteAsync方法在非常高的吞吐量下调用,对于每个请求,我们都需要提取数据. 因此,我在ids列表中循环的代码下方的代码低于代码,并在同步中对每个id进行了异步电话,并且可以正常工作. private async Task> ExecuteAsync(IList ids, IPollyPolicy policy, Func> mapper) where T : class { var tasks = new List>(ids.Count); // invoking multiple id in parallel to get data for each id from database for (int i = 0; i
30 2024-04-24
编程技术问答社区
虽未满员但仍有锁仓现象
我目前正在尝试优化一个旧的且写得不好的类,该类别处理大量数据,因此很容易花费多个小时才能通过一组数据进行运行.收集数据已经花费大量时间,这就是我在这里尝试改进的.我知道这是相当臭的代码,但这只是一个测试,如果这甚至改进了任何东西,请只关注这个问题: 我尝试了SemaphoreSlim和Semaphore,以减少同时运行的任务量.我的数据集将产生约70个任务,这可能会导致线程饥饿和整体性能退化.至少事实证明它的响应能力降低了.因此,我试图同时将其保持在5个任务中,以获得更好的总体吞吐量. 现在,当我尝试等待我的任务输入sempahore时,它会阻止它(使用纤细的semphore也在等待块),但是即使信号量不满,它也永远不会进入.此代码在异步方法中作为轻微的上下文提示. Semaphore throttle = new Semaphore(0, 5); try { foreach (var folder in folders) { // W
12 2024-04-24
编程技术问答社区
有优先权的半信半疑
我知道System.Threading>>>>命名空间中的Semaphore类,但是我看不出它是否允许等待线程具有不同的优先级级别. 如果两个线程正在等待一个打开的插槽,是否有一种方法可以允许更高优先级的线程可用? 解决方案 来自 没有保证的订单,例如 FIFO或LIFO,其中阻塞线程 输入信号. ,但请查看这两个项目,这些项目都支持线程的优先级.
22 2024-04-23
编程技术问答社区
带有beginwait功能的semaphore
我正在使用begin/end编写一个异步库,我需要锁定对象. 当前,我正在使用信号量进行此操作,但是调用semaphore.WaitOne()暂停了该线程的位置.我宁愿使用诸如Begin Wait之类的东西,因此它会立即返回并在信号量免费时调用回调函数. c#? 中是否有这样的对象 解决方案 实际上,这是我最终得到的 - 也许有人会发现它有用: class AsyncSemaphore { public AsyncSemaphore(int counter, int maxCounter) { this.maxCounter = maxCounter; this.counter = counter; } private int maxCounter, counter; class CallbackObject:IAsyncResult { private Async
10 2024-04-22
编程技术问答社区
SemaphoreSlim.WaitAsync是如何实现异步函数的顺序执行的?
这个问题的上下文是WPF应用程序. WPF应用程序使用dispatchersynchronizationContext. 如果我的应用程序中有一个按钮调用button_click处理程序方法,并且我想确保该函数中的所有代码仅由一个线程执行,我会将其包装在信号量中,如图所示?但是我不明白这是如何工作的. 假设按钮已单击,我们将击中waitasync(),该任务返回了当信号量输入时完成的任务,所以我猜立即猜?然后,我们将达到等待GetLengthAsync(),这将使我们回到WPF消息循环中.假设10秒耗尽并再次单击按钮,那么我们将再次输入button_click方法并点击waitasync(),该方法返回了当我们输入信号量时完成的任务,我们无法输入信号量消息循环?这是如何工作的吗? 主要问题 - 两次我们都击中Waitasync()我们在同一线程上,我们的信号量将并发限制仅允许一个线程一次执行该代码块,但是它不会允许我们的同一线程输入该代码?显然,信号量无法通过说其他线程
12 2024-04-22
编程技术问答社区
如果在同一实体上工作,.Net核心异步关键部分
如果使用相同的ID 在同一对象上使用,则需要确保通过Web API访问的方法不能同时访问. 我了解SemaphoreSlim的使用,但是对此的简单插入将锁定所有人的关键部分.但是我只需要在同一实体上工作而不在2个不同的 上锁定该部分才能锁定. 这是我的场景,用户开始工作,实体已创建并准备好修改,然后一个或多个用户可以操纵该实体,但是此操作的一部分必须在关键部分中或IT将导致数据不一致,当工作完成后,将从工作状态中删除实体并搬到和存档,并且只能访问ReadOnly 包含该函数的类是在应用程序的启动 的启动中的瞬态 services.AddTransient(f => new WorkerService(connectionString)); public async Task DoStuff(int entityId) { //Not Critical Stuff //Critical Stuff ReadO
12 2024-04-22
编程技术问答社区
在Linux C#上运行信号
我正在Linux上运行信号量,并且正在生成以下错误: "异常":{" className":" system.platformnotsupportedException"," message":"此平台上不支持此同步元素的命名版本. ," helpurl":null," stackTraceString":"在system.threading.semaphore.createsemaphorecore(int32 IntialCount,int32 int32 MaximumCount,string name,boolean&createNew&createNew)\ in System.threading.threading.semaphore.semaphore.ctor.ctor.ctor(Int32 Int32 Int32 Int32,Int32) maximumCount,string name,boolean&createNew)\ n在system.threading
22 2024-04-21
编程技术问答社区
跨进程(和机器)同步(Semaphores)。
背景: 我的WCF应用程序必须调用没有任何并发​​检查的服务.这是由第三方创建的服务,让他们添加并发检查可能是不可能的. 我可以确保通过我的WCF应用程序拨打第三方服务的唯一方法.因此,我正在考虑将并发检查放入我的代码中. 为此,我将使用一个标识符,该标识符唯一描述要修改的数据.这个想法是,如果一个呼叫对服务进行修改与标识符相关的数据,那么其他呼叫该标识符需要等到完成. 问题: 我的WCF服务负载平衡.我可以同时运行多达16个实例,所有这些实例都可以在不同的虚拟机上. 因此,用于同步的大多数.NET类假设一个共享的内存空间. 是否有标准的"最佳实践"类型的方法来进行负载平衡的服务实例? 我已经考虑使用数据库表(SQL Server)尝试管理此问题,但是从架构的角度来看,似乎是错误的,以将我的持久性层用于此目的.我希望有另一个解决方案. 摘要: 我如何进行机器的同步(锁,静音,信号量等)?(最好不使用数据库表来管理它.) 解
14 2024-04-21
编程技术问答社区
在.NET 4中使用 await SemaphoreSlim.WaitAsync。
我的应用程序正在使用.NET 4.我正在使用 nuget软件包 在我的应用程序中,我想在sempahore waitasync呼叫上等待. SemaphoreSlim semphore = new SemaphoreSlim(100); await semphore.WaitAsync(); 但是我正在遵循汇编错误. 'system.threading.semaphoreslim'不包含" waitasync"的定义,并且没有扩展方法'waitasync'接受类型的第一个参数'system.threading.semaphoreslim'(您是否缺少使用指令或使用指令或组装参考?) .NET 4.0中的uisng waitasync是否可以吗? 解决方案 您不能使用.net 4.0中的SemaphoreSlim.WaitAsync,因为此方法已添加到但是,您可以在public class AsyncSemaphore { private readonl
14 2024-04-20
编程技术问答社区
向父进程发出信号,表示子进程已经完全初始化了
我正在启动一个暴露WCF端点的儿童过程.我如何从子进程向父程流程发出信号,表明孩子已完全初始化,现在可以访问端点? 我考虑过将信号量用于此目的,但无法完全弄清楚如何达到所需的信号. string pipeUri = "net.pipe://localhost/Node0"; ProcessStartInfo startInfo = new ProcessStartInfo("Node.exe", "-uri=" + pipeUri); Process p = Process.Start(startInfo); NetNamedPipeBinding binding = new NetNamedPipeBinding(); var channelFactory = new ChannelFactory(binding); INodeControlle
16 2024-04-20
编程技术问答社区
Windows服务无法看到命名的信号灯
我正在尝试调解小型Windows服务,使其在启动过程中等待来自另一个过程的信号.可以肯定的是,我知道这种方法有时可能会导致服务启动超时.事实并非如此. 问题是命名system.thread.sempaphore i用于调解目的.信号量是使用以下构造创建并在其他地方获取的.当我明确地出于测试目的,我明确打破了下面的执行. ,GC没有更改. Boolean newOne; System.Threading.Semaphore rootSemaphore = new System.Threading.Semaphore(1, 1, "DummyServiceSemaphore", out newOne); 上面的代码显然效果很好.以下代码在调试模式下执行或在控制台应用程序下执行时运行良好: Boolean createdNew; System.Threading.Semaphore semaphore = new System.Threading.S
32 2024-04-19
编程技术问答社区
如何防止CPU "爆满"。同步方法异步调用多个工作者,并使用SemaphoreSlim进行节流?
我目前正在优化现有的,非常缓慢且定时制作的生产应用程序. 没有选择重写. 简而言之,这是一项WCF服务,目前依次将其他4个" Worker" WCF服务称为WCF服务.没有一个工人服务取决于另一个工作的结果. 因此,我们希望它一次(不是顺序)一次称呼它们.我将重申我们没有重写它的奢侈. 优化涉及一次调用所有工人服务.这是异步想到的地方. 我在异步编程方面的经验有限,但是就我的解决方案而言,我在主题上尽可能地读得很广. 问题是,在测试中,它可以起作用,但最大化了我的CPU.感谢您的帮助 以下是主要WCF服务中基本代码的简化版本 // The service operation belonging to main WCF Service public void ProcessAllPendingWork() { var workerTasks = new List>(); foreach(var workerServi
14 2024-04-18
编程技术问答社区
关于SemaphoreSlim与Async/Await的用法
我不是高级开发人员.我只是想掌握任务库,而只是谷歌搜索.我从来没有使用过班级SemaphoreSlim,所以我想知道它的作用.在这里,我提出代码,其中SemaphoreSlim与async&await一起使用,但我不明白.有人可以帮助我理解下面的代码. 第一组代码 await WorkerMainAsync(); async Task WorkerMainAsync() { SemaphoreSlim ss = new SemaphoreSlim(10); while (true) { await ss.WaitAsync(); // you should probably store this task somewhere and then await it var task = DoPollingThenWorkAsync(); } } async Task DoPollingThenWo
24 2024-04-18
编程技术问答社区
SemaphoreSlim'的超时功能是否违背了它自己的目的?
限制可以访问资源或池的线程数 资源同时 可以理解和清晰. ,但是我从来没有机会玩Wait的超载,但是Wait接受超时整数 - 但是,尽管我已经明确设置了 ally> ally> ally> laste 多个线程信号量一次不允许多个线程: private readonly SemaphoreSlim _mutex = new SemaphoreSlim(1); private void Main() { Task.Run(() => DelayAndIncrementAsync()); Task.Run(() => DelayAndIncrementAsync()); } private void DelayAndIncrementAsync() { _mutex.Wait(2000); try { Console.WriteLine(0); Thread.Sleep(TimeSpan.From
14 2024-04-18
编程技术问答社区