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