很多线程交互都是在用到的时候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();
}
}
}