C# 关于 System.InvalidOperationException-集合已修改,可能无法执行枚举操作报错!

原因:不能在foreach中修改集合(foreach内部代码有判断,更改集合会报异常),如果真的需要修改就是用for循环。

        解决方案一:使用for循环;

        解决方案二:调用ToArray();

				foreach (Int32 id in collection.ToArray())
				{
					//操作
				}

C#中,`Task.Run` 方法用于异步执行一个任务。然而,默认情况下,`Task.Run` 并不提供直接设置线程优先级的选项。不过,我们可以通过一些技巧来间接实现这一功能。 ### 使用 `TaskScheduler` 自定义调度器 我们可以创建一个自定义的 `TaskScheduler`,在其中指定线程优先级。以下是一个示例代码: ```csharp using System; using System.Threading; using System.Threading.Tasks; class Program { static void Main() { var priority = TaskPriority.Highest; // 设置线程优先级为最高 var customScheduler = new LimitedConcurrencyLevelTaskScheduler(1) { DefaultTaskPriority = priority }; Task.Factory.StartNew(() => { Console.WriteLine("Task started with high priority"); // 模拟一些工作 Thread.Sleep(2000); Console.WriteLine("Task completed with high priority"); }, CancellationToken.None, TaskCreationOptions.None, customScheduler).Wait(); } } public class LimitedConcurrencyLevelTaskScheduler : TaskScheduler { private readonly int _maxConcurrencyLevel; private readonly SynchronizationContext _synchronizationContext; private int _delegatesQueuedOrRunning = 0; public LimitedConcurrencyLevelTaskScheduler(int maxConcurrencyLevel) { _maxConcurrencyLevel = maxConcurrencyLevel; _synchronizationContext = new CustomSynchronizationContext(); } protected override void QueueTask(Task task) { if (Interlocked.Increment(ref _delegatesQueuedOrRunning) >= _maxConcurrencyLevel) { throw new InvalidOperationException("Max concurrency level reached."); } _synchronizationContext.Post(o => ((Task)o).ExecuteWithCustomPriority(), task); } protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) { return false; } protected override IEnumerable<Task> GetScheduledTasks() { return null; } public override int MaximumConcurrencyLevel => _maxConcurrencyLevel; private class CustomSynchronizationContext : SynchronizationContext { public override void Post(SendOrPostCallback d, object state) { ThreadPool.QueueUserWorkItem(state => ((Action<object>)d)(state)); } } } ``` ### 解释 - **LimitedConcurrencyLevelTaskScheduler**: 这是一个自定义的 `TaskScheduler`,它限制了并发级别,并允许我们设置线程优先级。 - **CustomSynchronizationContext**: 这是一个简单的同步上下文,用于将任务提交到线程池。 - **TaskPriority**: 通过 `TaskPriority` 枚举,我们可以选择不同的线程优先级(如 `Highest`, `AboveNormal`, `Normal`, `BelowNormal`, `Lowest`)。 ### 使用示例 在上面的示例中,我们创建了一个 `LimitedConcurrencyLevelTaskScheduler`,并将最大并发级别设置为1,同时设置了线程优先级为 `Highest`。然后,我们使用这个调度器来启动一个新的任务。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值