C# ConcurrentQueue和ManualResetEvent组成本地消息队列

 实现功能:每点击一次按钮,打印一个0到100的随机数

  • Trigger供可第三方调用
  • DoSomething在此例子中 为打印随机数(即业务逻辑过程)
  • 尚未验证多线程高频率调用情况下的准确性
// 调用方法
private void button1_Click(object sender, EventArgs e)
{
    // 0~100随机数
    Trigger(new Random().Next(0, 100).ToString());
}



//采用线程安全的队列
System.Collections.Concurrent.ConcurrentQueue myQueue = new ConcurrentQueue();
System.Threading.ManualResetEvent myEvent;

/// 
/// 需要启动的主线程
/// 
private void TestProcess()
{
    Thread myThread;
    myEvent = new ManualResetEvent(false);
    myThread = new Thread(()=>
    {
        while (true)
        {
            // 等待接收信号(可以理解为:等待调用Set()方法),阻塞线程。
            myEvent.WaitOne();
            ThreadPool.QueueUserWorkItem(new WaitCallback((state) =>
            {
                // 线程池执行业务逻辑方法,无需等待
                DoSomething();
            }));
            // 接收到信号后,重置“信号器”,信号关闭。
            myEvent.Reset();
        }
    });
    myThread.IsBackground = true;
    myThread.Start();
}

/// 
/// 业务逻辑
/// 
private void DoSomething()
{
    string output;
    myQueue.TryDequeue(out output);
    System.Console.WriteLine(DateTime.Now.ToString() + ":" +  output);
}

/// 
/// 触发器
/// 
/// 
public void Trigger(string input)
{
    myQueue.Enqueue(input);
    myEvent.Set();
}

执行结果 

C# ConcurrentQueue和ManualResetEvent组成本地消息队列_第1张图片

你可能感兴趣的:(C#,c#)