<多线程交互>使用反射的多线程交互,线程绑定类实现多线程

很多线程交互都是在用到的时候new一个线程,然后开始。在我初期使用的时候个人的感觉:1.线程没有统一,太乱。2.写线程交互的时候效率低下,容易出错。3.维护的时候容易遗忘。......反正不好用。

以下方式用到部分反射吧,其实也不算。就是程序内部寻找到继承类去实例化线程操作。交互起来很方便,把所有继承类代码放在一个文件夹下面管理:1.能看到整个程序的线程。2.双界面开发可以看到交互时的逻辑变化。3.维护的时候可以有目的性的查找。

有更好的线程实现方法,欢迎分享~~~

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace TaskTest
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Task> list_Task = new List<Task>();                //"线程"集合(线程池)
            List<BaseTask> list_BaseTask = new List<BaseTask>();    //"线程实现类"集合
            
            //以下是根据线程实现基类,运行线程子类
            var types = Assembly.GetCallingAssembly().GetTypes();   //获取"程序集的所有类型"
            var baseType = typeof(BaseTask);                        //获取"线程实现类"
            foreach (var type in types)                             //遍历"程序集的所有类型"
            {
                var baseT = type.BaseType;                          //获取"程序集的所有类型"的基类
                while (baseT != null)                               //判断:是否有基类(一般都有,因为所有类型的最底层基类为object)
                {
                    if (baseT.Name == baseType.Name)                //基类名是否和"线程实现类"一样
                    {
                        Type t = Type.GetType(type.FullName, true); //获取"程序集的所有类型的类全名"
                        object obj = Activator.CreateInstance(t);   //创建类全名的"实例"
                        if (obj != null)                            //"实例"不为空
                        {
                            BaseTask info = obj as BaseTask;        //实例强转"线程实现类"

                            info.IsRun = true;                      //执行"实例"开始标志
                            list_BaseTask.Add(info);                //加入"线程实现类"的集合
                            Task tast = new Task(info.Run);         //开启线程。"绑定线程实现类的RUN方法"
                            tast.Start();                           //开始线程
                            list_Task.Add(tast);                    //加入线程池
                        }
                        break;
                    }
                    else                                            //基类名是否和"线程实现类"不一样
                    {
                        baseT = baseT.BaseType;                     //赋为null。
                    }
                }
            }
            Console.ReadKey();
        }
    }
    public abstract class BaseTask                                              //抽象类,防止实例化
    {
        public bool IsRun;                                                      //开始标志位
        public BaseTask()                                                       //构造函数。每次实例都会执行此函数
        {
            Run();                                                              //开始方法
            Console.WriteLine("BaseRun");
        }
        public abstract void Run();                                             //抽象方法。防止实现
    }
    public class ATask : BaseTask
    {
        public static ManualResetEvent a_satart = new ManualResetEvent(false);  //线程交互:A类某方法开始(类库自带)
        public static ManualResetEvent a_end = new ManualResetEvent(false);     //线程交互:A类某方法结束
        private int i = 0;                                                      //执行体 i++
        public override void Run()                                              //执行A的RUN
        {
            BTask.b_end.Set();                                                  //B类某方法解除阻塞

            while (IsRun == true)                                               //循环A
            {
                A();
            }
        }
        public void A()                                                         //A类某方法
        {
            BTask.b_end.WaitOne();
            BTask.b_end.Reset();
            Console.WriteLine("A : " + i);
            i++;
            Thread.Sleep(1000);
            BTask.b_start.Set();
        }
    }

    public class BTask : BaseTask
    {
        public static ManualResetEvent b_start = new ManualResetEvent(false);
        public static ManualResetEvent b_end = new ManualResetEvent(false);
        private int i = 0;
        public override void Run()
        {
            while (IsRun == true)
            {
                B();
            }
        }
        public void B()
        {
            b_start.WaitOne();
            b_start.Reset();
            Console.WriteLine("B ; " + i);
            i++;
            Thread.Sleep(1000);
            b_end.Set();
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值