线程启动项目 修改 在 AppServer 类中,方便管理。
同时增加心跳,用来同步 数据并 定时批量存储数据库。
protected override void OnStarted() { ThreadPoolMain.OnStartThreadPool(); OnTimeServer(); base.OnStarted(); } //规定时间 检查一次心跳 public void theout(object source, System.Timers.ElapsedEventArgs e) { if(ServerModel.getInstance().queue.Count>0) { JsonData[] mes = ServerModel.getInstance().queue.Dequeue(); //拿到数据,批处理 算出 效益,并存放数据库 // Console.WriteLine("检测有没有发送过来 目前用户" + this.SessionCount); } } //定时器 作用, 同步 存储数据库 计算收益 void OnTimeServer() { System.Timers.Timer t = new System.Timers.Timer(2000);//实例化Timer类,设置间隔时间为10000毫秒; t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件; t.AutoReset = true;//设置是执行一次(false)还是一直执行(true); t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件; }
线程管理类 负责 推送给 定时器,同时定义数组JsonData[] obj
负责临时存放 事物,分配给各类线程处理。
public bool QueueWorkItem(ManualResetEvent eventX, int task) { // Console.WriteLine("线程池开始分配任务"); //定义数组 JsonData[] obj = new JsonData[task]; ThreadProcClass t = new ThreadProcClass(task, eventX, obj); for (int i = 0; i < task; i++) { DataTable dt = ServerModel.getInstance().dt; // Console.WriteLine(dt.Rows[i]["id"].ToString() + " == 第1种写法 " + dt.Rows[i]["time"].ToString());//行集合.行【号】列【名】 JsonData json = new JsonData(); json["task"] = i.ToString(); json["id"] = dt.Rows[i]["id"].ToString(); json["time"] = dt.Rows[i]["time"].ToString(); json["attack"] = dt.Rows[i]["attack"].ToString(); json["beaten"] = dt.Rows[i]["beaten"].ToString(); json["soldier"] = dt.Rows[i]["soldier"].ToString(); ThreadPool.QueueUserWorkItem(new WaitCallback(t.ThreadProc), new SomeState(json)); } //等待事件的完成,即线程调用ManualResetEvent.Set()方法 //eventX.WaitOne 阻止当前线程,直到当前 WaitHandle 收到信号为止。 eventX.WaitOne(Timeout.Infinite, true); Console.WriteLine("任务结束,数据存放到 list中"); Console.WriteLine("通知 定时器"); // 存放到 queue 中 ServerModel.getInstance().queue.Enqueue(obj); return true; }
线程中,负责 物理模拟,同时把数据放到传参过来的objs[]中
objs[task] = json;//保持数组
本周就先到这里。
时间: 2024-10-11 17:36:21