C#编程练习:使用队列存储消息,一次性存10条消息,每隔一段时间打印一条消息控制台打印消息时要有明显停顿感

一、任务:使用队列存储消息

实现目标:

(1)一次性存10条消息

(2)每隔一段时间打印一条消息控制台打印消息时要有明显停顿感


二、核心代码结构

1. 延时方法

public static void SleepTime(int seconds)
{
    for(int i = 0; i < seconds * 100000000; i++) { }
}

2. 消息队列初始化

Queue queue = new Queue();
for (int i = 0; i < 10; i++)
{
    queue.Enqueue("哈喽"); // 入队10条消息
}

三、三种遍历方式对比

方法1:foreach遍历(只读)

foreach (object i in queue)
{
    Console.WriteLine(i);
    SleepTime(10); // 延时效果
}

特点:不修改队列结构

输出:按FIFO顺序输出

队列状态:遍历后队列仍包含10条消息

方法2:ToArray转换后遍历

object[] array1 = queue.ToArray();
for (int i = 0; i < array1.Length; i++)
{
    Console.WriteLine(array1[i]);
    SleepTime(10);
}

特点:将队列转为数组后遍历

输出:按FIFO顺序输出

队列状态:原队列不受影响

方法3:Dequeue出队遍历(消费型)

while (queue.Count > 0)
{
    Console.WriteLine(queue.Dequeue()); // 出队操作
    SleepTime(10);
}

特点:边遍历边移除元素

输出:按FIFO顺序输出

队列状态:遍历后队列为空


四、完整代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace 进阶测试
{
    class Program
    {
        public static void SleepTime(int seconds)//明显停顿时间
        {
            for(int i=0;i< seconds*100000000;i++)
            {

            }
        }
         static void Main()
        {
            Queue queue = new Queue();
            for (int i = 0; i < 10; i++)
            {
                queue.Enqueue("哈喽");
            }

            Console.WriteLine("遍历方法1:");
            foreach (object i in queue)
            {
                Console.WriteLine(i);
                SleepTime(10);
            }
            Console.WriteLine();
            Console.WriteLine("***************************************");

            Console.WriteLine("遍历方法2:");
            object[] array1 = queue.ToArray();
            for (int i = 0; i < array1.Length; i++)
            {
                Console.WriteLine(array1[i]);
                SleepTime(10);
            }
            Console.WriteLine();
            Console.WriteLine("***************************************");

            Console.WriteLine("遍历方法3:");
            while (queue.Count > 0)
            {
                Console.WriteLine(queue.Dequeue());
                SleepTime(10);
            }
            Console.WriteLine();
            Console.WriteLine("***************************************");
        }
    }
}

<think>我们是在使用.NET的Queue类来实现一个消息队列存储10消息,然后每隔固定间(比如1秒)从队列中取出一条消息打印控制台,实现停顿效果。步骤:1.创建一个Queue<string>(或其他类型)来存储消息。2.初始化队列,将10消息(比如"消息1"到"消息10")加入队列。3.使用一个循环,每隔固定间(例如1000毫秒)从队列中取出(Dequeue)一条消息打印。4.当队列为空停止。注意:为了实现每隔一段时间执行一次,我们可以使用Thread.Sleep方法或者异步方法中的Task.Delay。这里为了简单,我们使用Thread.Sleep,但要注意它会阻塞当前线程。如果是在控制台应用程序,使用Thread.Sleep是简单的选择。另外,我们也可以使用器(System.Timers.Timer)来实现,但是需要注意定器是在线程池线程中触发,而队列的访问需要线程安全(这里由于是单线程,我们使用简单的循环即可)。以下是使用循环和Thread.Sleep的简单示例:我们使用System.Collections.Generic.Queue<T>类。代码示例:</think> ### C#实现队列存储与定打印消息解决方案 在C#中实现使用队列存储消息并定打印的功能,主要步骤如下: #### 1. 创建队列存储消息 ```csharp using System; using System.Collections.Generic; class Program { static void Main() { // 创建消息队列并添加10消息 Queue<string> messageQueue = new Queue<string>(); for (int i = 1; i <= 10; i++) { messageQueue.Enqueue($"这是第 {i} 消息 {DateTime.Now}"); } // 启动消息处理 ProcessMessages(messageQueue, interval: 1000); // 每秒处理一条 } } ``` #### 2. 定处理消息(实现停顿) ```csharp static void ProcessMessages(Queue<string> queue, int interval) { // 使用器定处理 var timer = new System.Timers.Timer(interval); timer.Elapsed += (sender, e) => { if (queue.Count > 0) { // 打印队列头部的消息 string message = queue.Dequeue(); Console.WriteLine($"[{DateTime.Now}] {message}"); } else { // 队列为空停止计器 Console.WriteLine("所有消息已处理完毕!"); timer.Stop(); } }; // 启动计器 timer.AutoReset = true; // 设置自动重复 timer.Enabled = true; // 启用计器 Console.WriteLine("开始处理消息...按任意键退出"); Console.ReadKey(); } ``` ### 关键实现点说明: 1. **队列实现**: - 使用`System.Collections.Generic.Queue<T>`确保消息按进入顺序处理 - `Enqueue()`添加消息队列尾部 - `Dequeue()`取出队列头部的消息 2. **定处理机制**: - 使用`System.Timers.Timer`实现定器功能 - `Interval`属性设置间间隔(毫秒) - `AutoReset = true`使定器自动重复触发 3. **线程安全**: - 在单线程应用中可以安全使用队列 - 多线程场景建议使用`ConcurrentQueue<T>`或添加同步锁 ### 运行效果: ``` 开始处理消息...按任意键退出 [2023-08-15 10:00:00] 这是第 1 消息 2023-08-15 09:59:59 [2023-08-15 10:00:01] 这是第 2 消息 2023-08-15 09:59:59 [2023-08-15 10:00:02] 这是第 3 消息 2023-08-15 09:59:59 ... 所有消息已处理完毕! ``` 将实现明显的秒级停顿效果,每消息间隔1秒打印。 ### 扩展优化建议: - **异步处理**:改用`Task.Delay`实现异步等待 - **持久化**:结合消息队列的持久化功能确保数据安全[^1] - **动态控制**:添加暂停/继续功能 [^1]:消息队列的持久化能保证其本身的元数据不会因异常情况而丢失,需要额外设置确保消息不丢失
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值