C# 我如何等到十项任务完成后再执行下十项任务

C# 我如何等到十项任务完成后再执行下十项任务,c#,task,C#,Task,我正在访问一个web服务,它有一个每分钟可以发出的请求限制。我必须访问X>10个条目,但每分钟只能访问10个条目 我将服务实现为单例,可以从代码的不同部分访问。现在我需要一个方法来知道,有多少人提出了要求,以及是否允许我提出一个新的要求 因此,我制作了一个小示例代码,其中添加了100个任务。每个任务的延迟时间为3秒,只有在以前没有十个任务的情况下,才能使用task.WhenAny执行task。但是,当我从列表中删除已完成的任务时,在mscorlib.dll中出现了一个“类型为'System.in

我正在访问一个web服务,它有一个每分钟可以发出的请求限制。我必须访问X>10个条目,但每分钟只能访问10个条目

我将服务实现为单例,可以从代码的不同部分访问。现在我需要一个方法来知道,有多少人提出了要求,以及是否允许我提出一个新的要求

因此,我制作了一个小示例代码,其中添加了100个任务。每个任务的延迟时间为3秒,只有在以前没有十个任务的情况下,才能使用
task.WhenAny
执行
task
。但是,当我从列表中删除已完成的任务时,在mscorlib.dll中出现了一个“
类型为'System.invalidoOperationException'的异常,但在用户代码中未处理该异常

我怎样才能解决这个问题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Test
    {
        private static Test instance;
        public static Test Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Test();
                }
                return instance;
            }
        }


        private List<Task> taskPool = new List<Task>();
        private Test()
        {

        }

        public async void AddTask(int count)
        {
            // wait till less then then tasks are in the list
            while (taskPool.Count >= 10)
            {
                var completedTask = await Task.WhenAny(taskPool);
                taskPool.Remove(completedTask);
            }

            Console.WriteLine("{0}, {1}", count, DateTime.Now);

            taskPool.Add(Task.Delay(TimeSpan.FromSeconds(3)));
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间控制台应用程序1
{
课堂测试
{
私有静态测试实例;
公共静态测试实例
{
得到
{
if(实例==null)
{
实例=新测试();
}
返回实例;
}
}
私有列表任务池=新列表();
私人测试()
{
}
公共异步void AddTask(整数计数)
{
//等待少于此时间,然后任务在列表中
而(taskPool.Count>=10)
{
var completedTask=wait Task.wheny(任务池);
任务池。删除(已完成任务);
}
WriteLine(“{0},{1}”,count,DateTime.Now);
taskPool.Add(Task.Delay(TimeSpan.FromSeconds(3)));
}
}
}

一位优秀的老先生解决了我的问题。这是一个典型的线程问题,有一些经过测试的概念可以解决它,这就是我正在使用的:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Test
    {
        private static Test instance;
        public static Test Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Test();
                }
                return instance;
            }
        }

        private static Semaphore _pool = new Semaphore(0, 10);
        private Test()
        {
            _pool.Release(10);
        }

        public async void AddTask(int count)
        {   
            _pool.WaitOne();
            var task = Task.Delay(TimeSpan.FromSeconds(3));
            Console.WriteLine("{0}, {1}", count, DateTime.Now);
            await task;
            _pool.Release();
        }
    }
}

你能给我们看看stacktrace吗?你是说调用堆栈。好吧,这是相当不起眼的,不,我指的是例外的stacktrace。好吧,它是德语的,所以它说,列表的顺序已经改变了(这是有意义的,因为我正在添加和删除项目)