在找个.NET简易队列模型: 排队处理 - 》 处理完做某事 1)可设置最大并发队列 2)支持事件驱动
时间: 2024-02-23 17:00:22 浏览: 17
您可以使用.NET自带的`ConcurrentQueue`类来实现队列模型,并使用`Task`和`async/await`语法来实现异步处理和事件驱动。以下是一个简单的示例代码:
```csharp
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
class Program
{
static ConcurrentQueue<string> queue = new ConcurrentQueue<string>();
static async Task Main(string[] args)
{
int maxConcurrency = 10; // 最大并发数
Task[] tasks = new Task[maxConcurrency];
while (true)
{
if (queue.TryDequeue(out string item))
{
int taskIndex = await Task.WhenAny(tasks);
tasks[taskIndex] = ProcessItemAsync(item);
}
else
{
await Task.Delay(1000); // 1秒钟后再重试
}
}
}
static async Task ProcessItemAsync(string item)
{
// 处理item
await Task.Delay(1000); // 模拟处理时间
// 处理完做某事
Console.WriteLine($"Processed item {item}.");
}
}
```
在此示例中,我们使用`ConcurrentQueue`来存储要处理的项,`TryDequeue`方法从队列中获取项并删除它。我们使用`Task.WhenAny`方法等待任意一个任务完成,然后将新的任务添加到该位置。通过这种方式,我们可以控制最大并发数。在`ProcessItemAsync`方法中,我们可以进行任何处理,并使用`await`语法等待异步操作完成,然后做某些事情(在此示例中,我们只是输出一条消息)。最后,在主程序循环中,我们不断地从队列中获取项并将它们添加到任务列表中,直到程序退出。