吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1259|回复: 3
收起左侧

[学习记录] C# 学习笔记 线程池,线程事件锁

[复制链接]
Cool_Breeze 发表于 2021-3-21 13:08
本帖最后由 Cool_Breeze 于 2021-3-21 14:14 编辑

[C#] 纯文本查看 复制代码
using System;
using System.Threading;
using System.Collections.Concurrent;

class Program
{
    static void Main()
    {
         // 事件锁 字段 AutoReset 在事件锁被终止时,等待一个线程执行后,自动恢复,阻塞线程。
         // ManualReset 线程执行完,需要手动恢复事件锁,不然线程将不会被阻塞。
        EventWaitHandle ewh1 = new EventWaitHandle(false, EventResetMode.AutoReset);
        EventWaitHandle ewh2 = new EventWaitHandle(false, EventResetMode.AutoReset);
        EventWaitHandle ewh3 = new EventWaitHandle(false, EventResetMode.AutoReset);
        EventWaitHandle ewh4 = new EventWaitHandle(false, EventResetMode.AutoReset);
        
        QueueArgs[] queueArgs = 
        {
            new QueueArgs(){ewh = ewh1},
            new QueueArgs(){ewh = ewh2},
            new QueueArgs(){ewh = ewh3},
            new QueueArgs(){ewh = ewh4},
        };
        
        // WaitCallback 委托类型 // 不太清楚线程池的工作原理
        // ThreadPool.QueueUserWorkItem(new WaitCallback(Print), queueArgs[0]);
        // ThreadPool.QueueUserWorkItem(new WaitCallback(Print), queueArgs[1]);
        // ThreadPool.QueueUserWorkItem(new WaitCallback(Print), queueArgs[2]);
        // ThreadPool.QueueUserWorkItem(new WaitCallback(Print), queueArgs[3]);
        
        Thread[] ThPool = new Thread[4]; // 自定义线程池也有这个问题,但还好。
        for (int i=0; i<ThPool.Length; i++)
            ThPool[i] = new Thread(new ParameterizedThreadStart(Print)); // ParameterizedThreadStart 带参数委托类型
        for (int i=0; i<ThPool.Length; i++)
            ThPool[i].Start(queueArgs[i]);
        
        int Order = 20;
        for (int i=0; i<Order ;i++)
        {
            QueueArgs.queue.Enqueue(i);
        }
        
        for (int i=0; i<queueArgs.Length ;i++)
        {
            QueueArgs.queue.Enqueue(-1); // 终止线程
        }
        
        for (int n=0; n<(Order+queueArgs.Length)/queueArgs.Length ; n++)
        {
            Console.WriteLine("第 {0} 轮", n+1);
            foreach (var qA in queueArgs)
            {
                qA.ewh.Set(); // 将事件终止 线程可以继续
                Thread.Sleep(1); // 开启线程池(ThreadPool)延迟太短了,线程还没有轮到它就又锁上了,这个不好管控
                qA.ewh.Reset(); // 将事件恢复, 线程阻塞
            }
        }
    }
    
    class QueueArgs
    {
        public static readonly ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
        public EventWaitHandle ewh; // 事件锁
    }
    
    static void Print(object Args) // 签名和 WaitCallback 一致
    {
        QueueArgs args = Args as QueueArgs;
        int temp;
        while (true)
        {
            args.ewh.WaitOne();
            QueueArgs.queue.TryDequeue(out temp);
            Console.WriteLine("Number {0}", temp);
            if (temp == -1) break; // 退出线程
        }
    }}


第 1 轮
Number 0
Number 1
Number 2
Number 3
第 2 轮
Number 4
Number 5
Number 6
Number 7
第 3 轮
Number 8
Number 9
Number 10
Number 11
第 4 轮
Number 12
Number 13
Number 14
Number 15
第 5 轮
Number 16
Number 17
Number 18
Number 19
第 6 轮
Number -1
Number -1
Number -1
Number -1

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
凌凌壹 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

dxaw2458 发表于 2021-3-21 19:05
你学c#是看书还是看视频教程 ? 我也想学习下
LongYuan11 发表于 2021-3-21 19:33
piyaohua 发表于 2021-3-22 12:57
dxaw2458 发表于 2021-3-21 19:05
你学c#是看书还是看视频教程 ? 我也想学习下

看视频啊,书也看
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-17 03:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表