C#中实现任务队列,要求最多并发四个任务,有一个任务完成就推入一个任务开始进行,直到任务列表的任务全部完成
时间: 2024-10-27 08:15:29 浏览: 14
C#添加Windows服务 定时任务
在C#中,你可以使用`System.Threading.Tasks`命名空间下的`Task`和`BlockingCollection`类来实现这样的任务队列。`BlockingCollection`是一个线程安全的并发集合,它可以作为生产者消费者模式的工作队列。为了限制并发任务数到4个,我们可以使用信号量(Semaphore)配合`BlockingCollection`来控制队列长度。
以下是一个简单的示例:
```csharp
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
class Program
{
private const int MaxConcurrentTasks = 4;
private static BlockingCollection<Task> queue = new BlockingCollection<Task>();
private static SemaphoreSlim semaphore = new SemaphoreSlim(MaxConcurrentTasks);
public static void Main()
{
for (int i = 0; i < 10; i++)
{
var task = Task.Run(() => ProcessQueueItem());
queue.TryAdd(task);
}
// 进行阻塞等待,直到所有任务处理完毕
queue.CompleteAdding();
queue.GetConsumingEnumerable().WaitAll();
Console.WriteLine("所有任务已完成");
}
private static async Task ProcessQueueItem()
{
await semaphore.WaitAsync(); // 等待获取许可
try
{
// 执行任务
Console.WriteLine($"开始处理第 {Interlocked.Increment(ref counter)} 项任务");
await Task.Delay(1000); // 模拟耗时操作
}
finally
{
semaphore.Release(); // 完成后释放许可,允许下一个任务进入
}
}
private static int counter = 0;
}
```
在这个例子中,我们创建了一个`BlockingCollection`来存储任务,并用一个`SemaphoreSlim`来控制并发。当一个新的任务加入队列时,`TryAdd`会尝试添加,如果队列已满,则任务会被阻塞直到队列中有空位。每个任务完成后,会自动释放一个许可给其他等待的任务。
阅读全文