不太会画图,先简单看下 程序流程,他比 其余 服务器 多了 一个 单独的 线程 内部数据库 物理运算,也就是 他的运算 不须要 客户端 时时给信息。sql
下面是 片断代码。数据库
var bootstrap = BootstrapFactory.CreateBootstrap(); if (!bootstrap.Initialize()) { Console.WriteLine("没法初始化"); Console.ReadKey(); return; } var result = bootstrap.Start(); Console.WriteLine("服务器启动: {0}!", result); if (result == StartResult.Failed) { Console.WriteLine("没法启动"); Console.ReadKey(); return; } Console.WriteLine("线程池开启!"); ThreadPoolMain.OnStartThreadPool();
public static void OnStartThreadPool() { cs = "server=127.0.0.1;database=playgame;user=sa;pwd=zzjzzj888;pooling=true;min pool size=10;max pool size=10000"; OnSqlHelper = new SqlHelper(cs); //新建ManualResetEvent对象而且初始化为无信号状态 ManualResetEvent eventX = new ManualResetEvent(false); ThreadPool.SetMaxThreads(12, 12); //线程池 ThreadQueue Queue = new ThreadQueue(); while (OnReadSql()>0) { Console.WriteLine("结束并修改数据库!!"); Queue.QueueWorkItem(eventX, taskcount);//分配任务 eventX = new ManualResetEvent(false); } } static int taskcount; //读取数据库,若是没符合条件 等待后继续读取 static int OnReadSql() { // 读取数据库数据,拿到最新的 当前时间点 以内 的数据。 //排序这列数据。 taskcount = sqls();//任务数量 if (taskcount == 0) { Thread.Sleep(11);//若是没有数据,则2秒钟后继续寻找 OnReadSql(); } return taskcount; }
public bool QueueWorkItem(ManualResetEvent eventX, int task) { Console.WriteLine("主线程运行开始"); Thread.Sleep(1000); ThreadProcClass t = new ThreadProcClass(task, eventX); for (int i = 0; i < task; i++) { JsonData json = new JsonData(); json["name"] = "zzj" + i; json["message"] = "ok" + i; ThreadPool.QueueUserWorkItem(new WaitCallback(t.ThreadProc), new SomeState(json)); } //等待事件的完成,即线程调用ManualResetEvent.Set()方法 //eventX.WaitOne 阻止当前线程,直到当前 WaitHandle 收到信号为止。 eventX.WaitOne(Timeout.Infinite, true); return true; }
public ThreadProcClass(int count, ManualResetEvent mre) { iMaxCount = count; eventX = mre; } public static int iCount = 0; public static int iMaxCount = 0; public ManualResetEvent eventX; public void ThreadProc(object i) { Console.WriteLine("Thread " + ((SomeState)i).json.ToJson()); Thread.Sleep(1111); //Interlocked.Increment()操做是一个原子操做,做用是:iCount++ 具体请看下面说明 //原子操做,就是不能被更高等级中断抢夺优先的操做。你既然提这个问题,我就说深一点。 //因为操做系统大部分时间处于开中断状态, //因此,一个程序在执行的时候可能被优先级更高的线程中断。 //而有些操做是不能被中断的,否则会出现没法还原的后果,这时候,这些操做就须要原子操做。 //就是不能被中断的操做。 Interlocked.Increment(ref iCount); if (iCount == iMaxCount) { // Console.WriteLine("最后一个子线程发出结束信号!"); //将事件状态设置为终止状态,容许一个或多个等待线程继续。 iCount = 0; eventX.Set(); } }