c# – 代码有什么问题
发布时间:2020-12-15 18:31:46 所属栏目:百科 来源:网络整理
导读:这让我很难理解这种情况下的实际行为.实际上在没有执行任务时会发生什么事情,但是稍后当SemaphoreSlim被处置时.它引发了我的异常 – System.ObjectDisposedException {“信号量已被释放.”} 我有一个类库 – public class ParallelProcessor{ private Action
这让我很难理解这种情况下的实际行为.实际上在没有执行任务时会发生什么事情,但是稍后当SemaphoreSlim被处置时.它引发了我的异常 –
System.ObjectDisposedException {“信号量已被释放.”} 我有一个类库 – public class ParallelProcessor { private Action[] actions; private int maxConcurrency; public ParallelProcessor(Action[] actionList,int maxConcurrency) { this.actions = actionList; this.maxConcurrency = maxConcurrency; } public void RunAllActions() { if (Utility.IsNullOrEmpty<Action>(actions)) throw new Exception("No Action Found!"); using (SemaphoreSlim concurrencySemaphore = new SemaphoreSlim(maxConcurrency)) { foreach (Action action in actions) { Task.Factory.StartNew(() => { concurrencySemaphore.Wait(); try { action(); } finally { concurrencySemaphore.Release(); } }); } } } } 并使用它像 – class Program { static void Main(string[] args) { int maxConcurrency = 3; Action[] actions = new Action[] { () => Console.WriteLine(1),() => Console.WriteLine(2),() => Console.WriteLine(3) }; //Array.Empty<Action>(); ParallelProcessor processor = new ParallelProcessor(actions,maxConcurrency); processor.RunAllActions(); Console.ReadLine(); } } 有人可以请点亮一下吗?提前致谢. 解决方法
问题是你的使用声明.这就是事情的发生方式:
>创建信号量 选项: >只需删除using语句(这样你就不会丢弃信号量,但除非你真的大量使用它,否则这不太可能是一个问题)>将您的方法更改为阻止(在using语句中),直到完成所有任务,例如通过使用Parallel.ForEach而不是直接调用Task.Factory.StartNew>更改代码以在任务中处理信号量,该任务仅在所有其他任务完成后执行 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |